【问题标题】:Entity Framework cant use the DbContext, model being created实体框架无法使用 DbContext,正在创建模型
【发布时间】:2012-11-08 21:02:27
【问题描述】:

我使用的是 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>

【问题讨论】:

  • 这个连接字符串是否在“执行应用程序的配置文件”中(引用异常),而不仅仅是在库项目的配置文件中?
  • 你说的太对了。我不知道我必须在我的单元测试项目中为连接字符串添加一个额外的配置文件才能使用 EF。这解决了我的问题,添加了另一个 app.config 文件。

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


【解决方案1】:

我看到您正在使用带有模板 (.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" />

【讨论】:

  • 实际上在 EF5 中,您应该能够将 edmx 和实体连接与 DbContext 一起使用。在 VS2012 中,T4 被更改为为 DatabaseFirst 生成 DbContext。
  • 我实际上是在尝试从代码优先转移到数据库优先。您的回答表明我们需要使用特殊的元数据填充字符串 - 谢谢。基本上,这意味着在使用 ADO.NET 向导时,需要使用“保存连接字符串”。
猜你喜欢
  • 2014-05-10
  • 2012-03-03
  • 2016-01-13
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2017-08-01
相关资源
最近更新 更多