我使用数据库第一种方法创建了我的模型。问题是我的连接字符串在运行时更改。因此,我为DBContext类添加了一个带有连接字符串的重载构造函数。
public partial class MyDataContext: DbContext
{
public MyDataContext: ()
: base("name=DbEntities")
{
}
// added this overloaded contructor
public MyDataContext: (string connectionString)
: base(connectionString)
{
}
我在运行时获得的连接字符串如下所示。
Integrated Security=SSPI;Data Source=localhost\sqlexpress;initial catalog=MyDatabase;Max Pool Size=100;Min Pool Size=20;Connect Timeout=15;
当我使用使用重载构造函数创建的MyDataContext运行查询时,我得到以下错误。
System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 上下文正在Code First模式中使用,代码是 从EDMX文件生成的数据库优先或模型优先 发展。这将无法正常工作。要解决这个问题,请不要 删除抛出此异常的代码行。如果你想使用 数据库优先或模型优先,然后确保实体 框架连接字符串包含在app.config或中 启动项目的web.config。如果你正在创建自己的 DbConnection,然后确保它是EntityConnection而不是 一些其他类型的DbConnection,并将它传递给其中一个 采用DbConnection的基础DbContext构造函数。了解更多 关于Code First,Database First和Model First,请参阅实体 这里的框架文档: http://go.microsoft.com/fwlink/?LinkId=394715
知道如何实现这一目标吗?
答案 0 :(得分:6)
您需要创建一个EntityConnectionString并将其传递给DbContext。您目前只使用SqlConnectionString。我建议你看一下EntityConnectionStringBuilder。
这是一个可用于Sql Database First方法的示例;
SqlConnectionStringBuilder sqlStringBuilder = new SqlConnectionStringBuilder();
sqlStringBuilder.Database = "database name":
sqlStringBuilder.Password = "password";
sqlStringBuilder.UserID = "userid";
// other properties
EntityConnectionStringBuilder entityStringBuilder = new EntityConnectionStringBuilder();
entityStringBuilder.ProviderConnectionString = sqlBuilder.ConnectionString;
entityStringBuilder.Provider = "System.Data.MySqlClient";
entityStringBuilder.Metadata = "resx//*/YourDbContext.csdl|resx//*/YourDbContext.ssdl|resx//*/YourDbContext.msl";
MyDbContext dbContext = new MyDbContext(entityStringBuilder.ConnectionString);