使用数据库优先

时间:2016-06-08 23:41:25

标签: c# entity-framework

我正在创建一个使用Entity Framework的应用程序;特别是,数据库优先。

当用户登录时,会在运行时创建ConnectionString,然后将其用于应用程序中的任何数据处理。

我已经在互联网上找到了许多这样的解决方案,这表明这样做的方法是为DbContext类实现另一个构造函数,该类创建调用基类DbContext(string)

public ApplicationDbContext(SqlConnection Connection)
            : base(Connection.ConnectionString)
        {
        }

这是我在一个单独的文件中创建的,它是生成代码的public partial class,用于说明任何进一步生成的代码,以覆盖这些文件中已有的内容。

但是,当应用程序运行时,只要使用此附加构造函数创建ApplicationDbContext,就会引发以下异常:

“在Code First模式下使用上下文,其中的代码是从EDMX文件生成的,用于Database First或Model First开发......”

这是有道理的,因为我正在使用数据库第一种方法。但是,我在使用Database First时所看到的所有答案都建议这样做。

MSDN上进一步研究后,我发现实际上还有另一个DbContext构造函数可供我使用:DbContext(String, DbCompiledModel)。我想知道这是否是我所缺少的,这是我需要的构造函数,因为我会说我使用的是编译模型(...或者我?)。

然而,这是接近它的正确方法还是需要以另一种方式处理?

1 个答案:

答案 0 :(得分:1)

首先在上下文类中添加构造函数重载,以接受string作为连接字符串:

public TestDBEntities()
    : base("name=TestDBEntities")
{
}
public TestDBEntities(string connectionString)
    : base(connectionString)
{
}

然后使用app.configweb.config中的连接字符串。您应该将&qout;替换为",也应该包含metadata=...,并且连接应采用以下格式:

var cn = @"metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" +
         @"provider=System.Data.SqlClient;" +
         @"provider connection string=""" +
         @"data source=(localdb)\v11.0;" +
         @"initial catalog=TestDB;" +
         @"integrated security=True;" +
         @"MultipleActiveResultSets=True;" +
         @"""";
var db = new TestDBEntities(cn);

注意:最好将新重载放在部分类中。然后,每当上下文.tt模板运行时,都不会触及它。