在运行时使用连接字符串

时间:2014-12-19 18:58:47

标签: c# entity-framework-6

我使用数据库第一种方法创建了我的模型。问题是我的连接字符串在运行时更改。因此,我为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

知道如何实现这一目标吗?

1 个答案:

答案 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);