📜  在程序集“EFCodeFirst”中发现了多个迁移配置类型.指定要使用的名称 - C# (1)

📅  最后修改于: 2023-12-03 15:23:35.764000             🧑  作者: Mango

在程序集“EFCodeFirst”中发现了多个迁移配置类型

当使用 Entity Framework 进行 C# 开发时,我们使用迁移来对数据库进行更新。但是,在某些情况下,系统无法确定哪个迁移配置应该使用,就会出现类似于“在程序集“EFCodeFirst”中发现了多个迁移配置类型”的错误。

这种错误通常发生在以下情况下:

  • 一个工程中包含多个迁移配置类
  • 在应用程序的 AppDomain 中存在多个程序集,并且每个程序集都包含一个迁移配置类

要解决这个问题,我们需要显式地指定要使用的迁移配置类。我们可以通过修改 DbMigrationsConfiguration 子类的 MigrationsConfiguration 属性来指定要使用的迁移配置。

修改 MigrationsConfiguration 的方式有两种:

1. 通过构造函数
public Configuration()
{
    MigrationsConfiguration = new MyMigrationConfiguration();
}

这样做的缺点在于,我们需要手动创建迁移配置类的实例,并将其赋值给 MigrationsConfiguration 属性。

2. 在 App.configWeb.config 中配置
<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="mssqllocaldb" />
    </parameters>
  </defaultConnectionFactory>
  <contexts>
    <context type="MyNamespace.MyContext, MyAssembly">
      <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[MyNamespace.MyContext, MyAssembly], [MyNamespace.MyMigrationConfiguration, MyAssembly]], EntityFramework">
        <parameters>
          <parameter value="MyContextConnectionString" />
        </parameters>
      </databaseInitializer>
    </context>
  </contexts>
</entityFramework>

entityFramework 节点下,我们可以配置多个上下文,每个上下文下又可以配置多个数据库初始化器。其中,MyNamespace.MyContext, MyAssembly 表示我们要使用的上下文的完全限定名和程序集名称,MyNamespace.MyMigrationConfiguration, MyAssembly 表示我们要使用的迁移配置的完全限定名和程序集名称。

这种方式的好处是,我们无需手动创建迁移配置类的实例,而是通过配置文件来指定。同时,我们也可以为每个上下文指定不同的迁移配置。

在此,我们简要介绍了如何解决“在程序集“EFCodeFirst”中发现了多个迁移配置类型”的问题,希望对你有所帮助。详细的解决方法可以参考 官方文档