10

我正在使用 EF 4.1,并创建了一个普通的 EF edmx 文件。我从数据库生成它。

生成后,我右键单击并选择添加代码生成项,以生成新类,并改用 DbContext。我使用模板 DbContext 生成器。

一切正常。

然后我尝试查询上下文:

using (var context = new PasDBEntities())
{
    var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId);
    if(client!=null)

创建上下文的新实例没有问题,但是当我尝试查询它时,问题就出现了。我卡在了 UnintentionalCodeFirstException 上。并得到错误:

{"如果在 Code First 模式下使用用于 Database First 和 Model First 开发的 T4 模板生成的代码可能无法正常工作。要继续使用 Database First 或 Model First,请确保在执行应用程序的配置文件中指定实体框架连接字符串. 要使用从 Database First 或 Model First 生成的这些类,使用 Code First 添加使用属性或 DbModelBuilder API 的任何其他配置,然后删除引发此异常的代码。"}

我不想先使用代码,但我不知道我是否可以“关闭”它,或者问题出在哪里。

作为参考,这是我的构造函数...

public partial class PasDBEntities : DbContext
{
    public PasDBEntities()
        : base("PasDBEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

...和连接字符串:

<connectionStrings>
    <add name="PasDBEntities" 
         connectionString="metadata=res://*/PasDB.csdl|
                                    res://*/PasDB.ssdl|
                                    res://*/PasDB.msl;
                           provider=System.Data.SqlClient;
                           provider connection string=&quot;
                           data source=localhost;
                           initial catalog=PasDB;
                           integrated security=True;
                           pooling=False;
                           multipleactiveresultsets=True;
                           App=EntityFramework&quot;"
         providerName="System.Data.EntityClient" />
</connectionStrings>
4

1 回答 1

7

我看到您正在使用带有模板 (.tt) 的 EDMX 来生成类。但如果您从现有数据库中获取信息,向导将创建一个与 ObjectContext 兼容的 ConnectionString(元数据信息和实体框架的提供者)。

问题是您使用的连接字符串用于 ObjectContext(数据库优先和模型优先)。对于 DbContext,您应该使用没有元数据信息的连接字符串。

您的连接字符串应该是:

<connectionStrings>
<add name="PasDBEntities" 
     connectionString="data source=localhost;
                       initial catalog=PasDB;
                       integrated security=True;
                       pooling=False;
                       multipleactiveresultsets=True;
                       App=EntityFramework"
     providerName="System.Data.SqlClient" />

于 2012-11-08T13:02:27.050 回答