【问题标题】:The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development上下文在 Code First 模式下使用,代码是从 EDMX 文件生成的,用于 Database First 或 Model First 开发
【发布时间】:2019-10-11 12:09:42
【问题描述】:

我正在尝试将最初使用 EF4 开发的项目迁移到 EF6,以利用 EF6 事务管理。

我面临的问题是该项目是使用数据库优先方法创建的,所以当我使用context.Database.UseTransaction 之类的代码时,我遇到了以下错误:

The context is being used in Code First mode with code that was generated from an EDMX file for either Database First or Model First development.

此异常在我的 DbContext 类的 OnModelCreating 方法内触发。

有什么想法吗?

谢谢

编辑:

问题在于它是使用 EDMX 和数据库优先方法的遗留代码。我必须在这个项目中实现 EF6 事务,所以它现在应该更像代码优先模式。

另外,这里是上下文类:

public class MyContext : BaseDbContext
{
    public MyContext (DbConnection existingConnection, bool contextOwnsConnection)
        : base(existingConnection, contextOwnsConnection)
    {
    }
}

还有连接字符串:

  <add name="CS"
         connectionString="Data Source=MyServ;Initial Catalog=MyDBName;User Id=MyUser;Password=MyPwd;Pooling=True;Min Pool Size=5;Max Pool Size=20;Persist Security Info=True;MultipleActiveResultSets=True;Application Name=EntityFramework;Enlist=false"
         providerName="System.Data.EntityClient" />

我尝试将providerName 设置为System.Data.SqlClient,但没有任何改变。

请注意,原始连接字符串是数据库第一格式:

<add name="OrderManagement"
     connectionString="metadata=res://*/MyManagementModel.csdl|res://*/MyManagementModel.ssdl|res://*/MyManagementModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MyServer;Initial Catalog=MyDBName;User Id=MyUser;Password=MyPwd;Pooling=True;Min Pool Size=5;Max Pool Size=20;Persist Security Info=True;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

如果我在将连接字符串保留为数据库优先格式的同时尝试打开连接,我将面临异常Keyword metadata not supported,当我将连接字符串置于代码优先格式时,我将面临错误@ 987654331@

【问题讨论】:

  • 检查您的连接字符串。如果它不包含元数据部分,则假定它首先是代码,如果包含,则假定它是基于 edmx 的。因此,您可能有一个连接字符串实例化了缺少元数据部分的数据库上下文。
  • 感谢您的回复。这就是事情开始变得奇怪的地方。在实例化我的 dbcontext 时,我尝试了两种连接字符串格式。当我使用代码优先方法(没有元数据部分)时,我仍然得到上面提到的相同错误,当我添加元数据部分时,它显示“不支持关键字:'元数据'”
  • 当您拥有元数据部分时,您的 providername 设置为什么?
  • 设置为“System.Data.EntityClient”。我尝试将其设置为“System.Data.SqlClient”,但它是一样的。
  • 当您使用数据库优先方法并使用 edmx 时,使用 OnModelCreating 没有任何意义。请添加有关该问题的更多详细信息,例如分享您的上下文文件代码,并说明您是否使用 edmx 并从网络配置分享您的连接字符串。

标签: c# .net entity-framework


【解决方案1】:

将上下文从数据库优先转换为代码优先时最常见的错误是忘记删除生成的OnModelCreating。在数据库优先的上下文中,OnModelCreating 会引发异常:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();  // ← throws exception
}

因此,请查看您的上下文或其基类(以及它们的部分类),如果它与上面的代码类似,则应将其删除。

您的代码和配置也需要一些更改。

您正在使用providerName="System.Data.EntityClient" 作为代码优先上下文。您应该将连接字符串更改为以下内容:

<add name="MyContext" connectionString="data source=server;
initial catalog=database;User Id=user;Password=password;
multipleactiveresultsets=True;application name=EntityFramework" 
providerName="System.Data.SqlClient" />

那么你应该把你的上下文构造函数改成这样:

public partial class MyContext: DbContext
{
    public MyContext() : base("name=MyContext") { /* . . .*/ }
    // . . . 
}

另外,如果您想拥有一个通用基类,请按照上述说明进行操作。

注意:要从现有数据库创建代码优先,您可以右键单击项目并选择添加新项目,然后在Visual C#下em> 在 Data 下选择 ADO.NET Entity Data Model 并单击 Add。然后从 Entity Data Model Wizard 中选择 Code First from Database 并按照向导进行操作。欲了解更多信息,请参阅Entity Framework Code First to an Existing Database

【讨论】:

  • 感谢您的回复。但是,即使我删除了 onModelCreating 方法,仍然会抛出异常。我还尝试在连接字符串中用 SqlClient 替换 EntityClient,但它没有任何改变。最后,我无法修改构造函数,因为我需要传递一个 DbConnection 并指定“contextOwnsConnection”参数。
  • 当您删除throw new UnintentionalCodeFirstException(); 时,您将不会收到相同的异常,除非您在基类中也有此方法。例如,由于使用错误的提供程序而收到的异常与由于模型创建中的那行代码而收到的异常不同。您应该按照答案中的所有说明来获得结果。也不要忽视 Note 部分。
  • 好的,等我有时间再试试
  • 如果你有手动添加的实体(对象)并且你想在没有 edmx 文件的情况下工作,只需从 DbContext 文件中删除 OnModelCreating 方法,它就会得到解决
【解决方案2】:

您只需从 App.config 复制连接字符串并将其粘贴到您的 Web.config 文件中。

确保您的 EDMX 已更新到与数据库的最新连接。

这对我有用。

【讨论】:

    【解决方案3】:

    我只是像这样在 web.config 中连接字符串

    connectionString="metadata=res:///Models.wimEntities.csdl|res:///Models.wimEntities.ssdl|res://*/Models.wimEntities.msl;provider =System.Data.SqlClient;provider connection string="data source=.;initial catalog=DATABASE;persist security info=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多