我们开发了模块化的ASP.NET MVC 5应用程序(首先是EF6代码)。每个模块都有自己的DbContext。我们有一种“核心”模块。我们其他模块中的某些类继承自核心类。核心不得引用模块。 更新:模块项目通常引用核心项目。
自动创建数据库。我们遍历所有模块程序集并迁移每个模块和核心的DbMigrationsConfiguration:
Type configurationType = assembly.GetType(assembly.GetName().Name +".Migrations.Configuration");
Object configurationInstance = Activator.CreateInstance(configurationType);
DbMigrator configurationMigrator = new DbMigrator((DbMigrationsConfiguration)configurationInstance);
configurationMigrator.Update();
Database.SetInitializer<DbContext>(null);
//核心类示例
[Table("Core.ClassA")]
public class ClassA
{
public int Id { get; set; }
public HashSet<ClassB> classb { get; set; }
}
[Table("Core.ClassB")]
public class ClassB
{
public int Id { get; set; }
}
//模块类示例
[Table("Module.ClassC")]
public class ClassC : ClassA
{
public string field { get; set; }
}
当我们在模块上下文中存储C类实例时,它会失败,因为模块上下文没有引用ClassA和ClassB。我们如何解决这个问题并将模块化分开上下文和模块?
更新:我们尝试使用DbContext继承来解决问题。模块DbContext继承自核心DbContext。这乍一看就解决了这个问题。不幸的是,自动迁移会尝试为每个模块创建所有核心表,因为重复的表是不可能的。所以我们尝试用
排除模块上下文中的所有核心实体modelBuilder.Ignore<ClassA>();
这也不起作用,因为模块上下文丢失了对核心实体的所有引用(我们只是想忽略它们用于模型构建并保留所有引用)。 所以我们的问题仍无法解决。