C# 首次使用数据库时,将现有连接传递给DbContext构造函数时出错

C# 首次使用数据库时,将现有连接传递给DbContext构造函数时出错,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我正在尝试创建一个类来执行数据库工作,并且需要(或首选)结合使用DbContext和老式的ADO。为什么,EF对于简化大量代码非常有用,但是ADO对于EF还不能处理的更复杂的方法仍然有很多用途 上的此链接声明我可以将现有的SqlConnection传递到我的上下文,如下所示: using (var conn = new SqlConnection("...")) { conn.Open(); using (var context = new SampleContext(conn

我正在尝试创建一个类来执行数据库工作,并且需要(或首选)结合使用DbContext和老式的ADO。为什么,EF对于简化大量代码非常有用,但是ADO对于EF还不能处理的更复杂的方法仍然有很多用途

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

using (var conn = new SqlConnection("..."))
{ 
    conn.Open();
    using (var context = new SampleContext(conn, contextOwnsConnection: false))
    {
    // Do Something
    }
}
public partial class MyEntities : DbContext
{
    public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
        : base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
    {

    }
}
现在我先使用数据库,这样这个构造函数就不会显示为标准。因此,我创建了一个新的分部类文件,并创建了相应的构造函数,如下所示:

using (var conn = new SqlConnection("..."))
{ 
    conn.Open();
    using (var context = new SampleContext(conn, contextOwnsConnection: false))
    {
    // Do Something
    }
}
public partial class MyEntities : DbContext
{
    public MyEntities(System.Data.Common.DbConnection conn, bool contextOwnsConnection = false)
        : base(existingConnection: conn, contextOwnsConnection: contextOwnsConnection)
    {

    }
}
但是,当我在调用新的DbContext构造函数的那一刻运行代码时,我在EDMX文件中得到了由OnModelCreating抛出的以下错误:

“如果在代码优先模式下使用,则使用T4模板为数据库优先和模型优先开发生成的代码可能无法正常工作。要继续先使用数据库或先使用模型,请确保在正在执行的应用程序的配置文件中指定了实体框架连接字符串。要使用这些首先从数据库生成的类或首先从模型生成的类,请使用代码首先使用属性或DbModelBuilder API添加任何其他配置,然后删除引发此异常的代码。”

我是否在这里遗漏了一些明显的东西,或者只是不能首先使用数据库

显然,我可以只使用两个连接,一个用于SqlConnection对象,另一个用于DbContext对象,但是如果可以的话,如果可能的话,我当然更喜欢使用单个连接


非常感谢所有帮助。为了充分披露,我使用的是SQL Server 2012、.NET 4.5.1、C#和EF6.0.2。

设计器使用的连接字符串不是常规连接字符串。它们是
EntityConnection
字符串。区别在于,实体连接字符串包含有关到何处的附加信息查找描述模型的元数据,该元数据在设计时以edmx的形式出现-请阅读更多。代码首先仅使用常规连接字符串,因为它基于代码动态构建模型。因此,意外的CodeFirstException阻止用户对edmx模型使用CodeFirst功能,因为该模型在e edmx,而不是在代码中,如果允许,您将有效地使用两个不同的模型(一个来自edmx,另一个来自代码),它们很可能不同步,这将导致奇怪的行为,甚至可能导致数据损坏和崩溃/异常。
由于EntityConnection是从DbConnection派生而来的,并且只包装了常规连接,因此您可以在使用提供程序连接的地方使用它。或者,您可以使用EntityConnection上的提供程序访问包装的提供程序连接。

谢谢,当有人向您解释时,它实际上非常有意义你!!我想为了简单起见,我要么继续使用双连接,要么只是将任何EF代码迁移到普通的旧ADO。再次感谢。