我正在创建一个使用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)
。我想知道这是否是我所缺少的,这是我需要的构造函数,因为我会说我使用的是编译模型(...或者我?)。
然而,这是接近它的正确方法还是需要以另一种方式处理?
答案 0 :(得分:1)
首先在上下文类中添加构造函数重载,以接受string
作为连接字符串:
public TestDBEntities()
: base("name=TestDBEntities")
{
}
public TestDBEntities(string connectionString)
: base(connectionString)
{
}
然后使用app.config
或web.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
模板运行时,都不会触及它。