使用Database-First时,将现有连接传递给DbContext构造函数时出错

Jon*_*amy 2 c# entity-framework entity-framework-6

我正在尝试创建一个类来执行数据库的工作,并且需要(或偏好)使用DbContext和良好的老式ADO的组合.为什么,EF非常适合简化大量代码,但ADO仍然有许多用于EF无法处理的更复杂方法的用途.

MSDN上的此链接声明我可以将现有的SqlConnection传递给我的上下文,如下所示:

using (var conn = new SqlConnection("..."))
{ 
    conn.Open();
    using (var context = new SampleContext(conn, contextOwnsConnection: false))
    {
    // Do Something
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用Database-First,因此这个构造函数不会显示为标准.因此,我创建了一个新的Partial Class文件并创建了相应的构造函数,如下所示:

public partial class MyEntities : DbContext
{
    public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
        : base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在遇到对新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,然后删除引发此异常的代码."

我在这里遗漏了一些明显的东西,还是只是没有使用Database-First?

显然,我可以使用两个连接,一个用于我的SqlConnection对象,另一个用于我的DbContext对象,但如果可以的话,我自然希望尽可能使用单个连接.

任何和所有的帮助非常感谢.为了完整披露,我使用的是SQL-Server 2012,.NET 4.5.1,C#和EF6.0.2.

Paw*_*wel 6

设计器使用的连接字符串不是常规连接字符串.相反,他们是EntityConnection字符串.区别在于实体连接字符串包含有关在何处查找描述模型的元数据的附加信息,该元数据在设计时以edmx的形式存在 - 请在此处阅读更多内容.Code First仅使用常规连接字符串,因为它基于代码动态构建模型.因此,UnintentionalCodeFirstException阻止用户在edmx模型中使用CodeFirst功能,因为模型是在edmx中而不是在代码中指定的,如果允许的话,你最终会使用两个不同的模型(一个来自edmx,另一个来自代码)很可能不会同步导致奇怪的行为,甚至可能导致数据损坏和崩溃/异常.由于EntityConnection派生自DbConnection并且只包装常规连接,因此您可以在使用提供程序连接的位置使用它.或者,您可以使用EntityConnection上的StoreConnection提供程序访问包装的提供程序连接.