实体框架无法使用正在创建的模型DbContext

时间:2011-10-30 11:18:35

标签: entity-framework entity-framework-4.1 connection-string database-first

我正在使用EF 4.1,我创建了一个普通的EF edmx文件。 我是从DB生成的。

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

一切正常。

然后我试着查询上下文:

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

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

  

{“如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作。要继续使用Database First或Model First,请确保在配置文件中指定了Entity Framework连接字符串要使用这些从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>

1 个答案:

答案 0 :(得分:7)

我看到你正在使用EDMX和模板(.tt)来生成类。但是,如果要从现有数据库获取信息,向导将创建与ObjectContext兼容的ConnectionString(元数据信息和entityframework提供者)。

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

您的连接字符串应为:

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

相关问题