我从AdventureWorks数据库生成了实体模型;现在我想删除app.config中的连接字符串并在运行时设置它。在Model1.Context.cs文件中,我将构造函数设置为
public AdventureWorksEntities(string str)
: base("name=AdventureWorksEntities")
{
this.Database.Connection.ConnectionString = str;
}
并在program.cs文件中
EntityConnectionStringBuilder ecsb = new EntityConnectionStringBuilder();
ecsb.Metadata = @"res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl";
ecsb.Provider = @"System.Data.SqlClient";
ecsb.ProviderConnectionString =
@"data source=.\sqlexpress;initial catalog=AdventureWorks;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework";
using (var ent = new AdventureWorksEntities(ecsb.ConnectionString))
{
Console.WriteLine(ent.Database.Connection.ConnectionString);
var add = ent.Addresses;
foreach (var ad in add)
{
Console.WriteLine(ad.City);
}
}
Console.ReadKey();
现在它说没有找到元数据关键字。如何在运行时为entityframework设置连接字符串?
答案 0 :(得分:7)
这是使用标准.aspx登录信息在连接字符串中设置UserID和Password信息的示例。 web.config或app.config文件中没有存储连接字符串设置。
修改Model.Designer.cs页面,如下所示:
public partial class Entities : ObjectContext
{
#region Constructors
public static string getConStrSQL(string UID,string PWD)
{
string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder
{
Metadata = "res://*",
Provider = "System.Data.SqlClient",
ProviderConnectionString = new System.Data.SqlClient.SqlConnectionStringBuilder
{
InitialCatalog = "your_database_name",
DataSource = "your_server",
IntegratedSecurity = false,
UserID = UID,
Password = PWD,
}.ConnectionString
}.ConnectionString;
return connectionString;
}
/// <summary>
/// Initialize a new Entities object.
/// </summary>
public Entities(string UID,string PWD)
: base(getConStrSQL(UID,PWD), "Entities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
......
然后在你的代码页面后面:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Mvc;
using System.Web.Security;
public partial class views_html_form : System.Web.UI.Page
{
public void Page_Load()
{
if (currentUser() == null)
{
HttpContext.Current.Response.Redirect("~/login.aspx");
}
}
public static MembershipUser currentUser()
{
MembershipUser currentUser = Membership.GetUser();
return currentUser;
}
public static string UID()
{
string UID = currentUser().UserName;
return UID;
}
public static string PWD()
{
string PWD = currentUser().GetPassword();
return PWD;
}
public static void SelectRecord()
{
YourModel.Entities db = new YourModel.Entities(UID(), PWD());
var query = from rows in db.Table_Name orderby rows.ID select rows;
.....
就是这样。不要乱用.config文件。或者,您可以以相同的方式发送数据库名称,例如,作为参数。
答案 1 :(得分:2)
我会选择类似的东西:
public AdventureWorksEntities(string server, string databaseName, string user, string password)
:base(new System.Data.EntityClient.EntityConnectionStringBuilder
{
Metadata = "res://*",
Provider = "System.Data.SqlClient",
ProviderConnectionString = new System.Data.SqlClient.SqlConnectionStringBuilder
{
InitialCatalog = databaseName,
DataSource = server,
IntegratedSecurity = false,
UserID = user,
Password = password,
}.ConnectionString
}.ConnectionString)
{
}