我正在尝试创建一个类来执行数据库上的工作,并且需要(或首选)使用DbContext和老式ADO的组合。为什么,EF非常适合简化大量代码,但ADO仍然有许多用于EF无法处理的更复杂方法的用途。
MSDN上的这个链接指出我可以将现有的SqlConnection传递给我的上下文,如下所示:
using (var conn = new SqlConnection("..."))
{
conn.Open();
using (var context = new SampleContext(conn, contextOwnsConnection: false))
{
// Do Something
}
}
现在我正在使用Database-First,因此这个构造函数不会显示为标准。因此,我创建了一个新的Partial Class文件并创建了相应的构造函数,如下所示:
public partial class MyEntities : DbContext
{
public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
: base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
{
}
}
但是,当我在遇到对新DbContext构造函数的调用时运行代码时,我在EDMX中得到 OnModelCreating 引发的以下 UnintentionalCodeFirstException()错误文件:
“如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作。要继续使用Database First或Model First,请确保在实例框架中指定了Entity Framework连接字符串。使用这些从Database First或Model First生成的类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码。“ < / p>
我是否遗漏了一些明显的东西,或者只是没有使用Database-First?
显然,我可以使用两个连接,一个用于我的SqlConnection对象,另一个用于我的DbContext对象,但如果可以的话,我自然希望尽可能使用单个连接。
任何和所有帮助都非常感谢。为了完整披露,我使用的是SQL-Server 2012,.NET 4.5.1,C#和EF6.0.2。
答案 0 :(得分:6)
设计人员使用的连接字符串不是常规连接字符串。相反,它们是EntityConnection
个字符串。区别在于实体连接字符串包含有关在何处查找描述模型的元数据的其他信息,该元数据在设计时以edmx的形式存在 - 阅读更多here。 Code First仅使用常规连接字符串,因为它基于代码动态构建模型。因此,UnintentionalCodeFirstException阻止用户在edmx模型中使用CodeFirst功能,因为模型是在edmx中而不是在代码中指定的,如果允许的话,你最终会使用两个不同的模型(一个来自edmx,另一个来自代码)很可能不会同步导致奇怪的行为,甚至可能导致数据损坏和崩溃/异常。
由于EntityConnection派生自DbConnection并且只包装常规连接,因此您可以在使用提供程序连接的位置使用它。或者,您可以使用EntityConnection上的StoreConnection提供程序访问包装的提供程序连接。