在Code First模式中使用上下文,其中包含从EDMX文件生成的用于Database First或Model First开发的代码

时间:2016-11-15 16:33:10

标签: c# .net entity-framework

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

我遇到的问题是项目是使用Database First方法创建的,所以当我使用像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.

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

有什么想法吗?

由于

修改

问题在于它是使用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,当我将连接字符串放在代码优先格式时,我面对的是错误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.

3 个答案:

答案 0 :(得分:5)

将上下文从数据库优先转换为代码时最常见的错误是忘记删除生成的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#下 Data 下选择 ADO.NET实体数据模型,然后单击添加。然后从实体数据模型向导中选择数据库中的代码优先并按照向导进行操作。有关详细信息,请参阅Entity Framework Code First to an Existing Database

答案 1 :(得分:1)

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

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

这适合我。

答案 2 :(得分:0)

我只是在web.config中连接字符串,如此

  

的connectionString =&#34;元数据= RES:// /Models.wimEntities.csdl|res:// /Models.wimEntities.ssdl|res://*/Models.wimEntities。 msl; provider = System.Data.SqlClient; provider connection string =&#34; data source =。; initial catalog = DATABASE; persist security info = True; MultipleActiveResultSets = True; App = EntityFramework&#34;&#34;的providerName =&#34; System.Data.EntityClient&#34;