是否可以拆分(不移动到单个类库项目)迁移到多个 .NET Core 类库?
我遵循将应用程序拆分为几个独立模块的架构设计。 ( Source )
但是我在将迁移拆分到多个项目时遇到了问题。这受支持吗?
在启动时,我加载特定文件夹中的 dll 文件。在 DbContext.OnModelCreating
中,我注册了从加载的 dll 文件加载的所有类型并注册了实体。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
List<Type> typeToRegisters = new List<Type>();
foreach (var module in GlobalConfiguration.Modules)
{
typeToRegisters.AddRange(module.Assembly.DefinedTypes.Select(t => t.AsType()));
}
RegisterEntities(modelBuilder, typeToRegisters);
base.OnModelCreating(modelBuilder);
RegisterCustomMappings(modelBuilder, typeToRegisters);
}
private static void RegisterEntities(ModelBuilder modelBuilder, IEnumerable<Type> typeToRegisters)
{
var entityTypes = typeToRegisters.Where(x => x.GetTypeInfo().IsSubclassOf(typeof(EntityBase)) && !x.GetTypeInfo().IsAbstract);
foreach (var type in entityTypes)
{
modelBuilder.Entity(type);
}
}
private static void RegisterCustomMappings(ModelBuilder modelBuilder, IEnumerable<Type> typeToRegisters)
{
var customModelBuilderTypes = typeToRegisters.Where(x => typeof(ICustomModelBuilder).IsAssignableFrom(x));
foreach (var builderType in customModelBuilderTypes)
{
if (builderType != null && builderType != typeof(ICustomModelBuilder))
{
var builder = (ICustomModelBuilder)Activator.CreateInstance(builderType);
builder.Build(modelBuilder);
}
}
}
但我不知道如何使用 context.Database.Migrate();
想法是,如果 ASP.NET Core 部署不包含特定模块,则不会创建/更新表。如果在未来的任何时候,客户购买了模块 D,我就将 dll 发送给他们。下一次启动 context.Database.Migrate();
将创建所有表并为该模块应用迁移。
附加示例:
想法是将应用程序拆分为模块。假设模块 A、B 和 C。客户 1 购买模块 A 和 B,客户 2 购买模块 A 和 C。
没有必要为客户 1 创建模块 C 的表,为客户 2 创建模块 B 的表。
在未来的某个时候,客户 1 购买了模块 C(他们收到了模块 C 的 dll)。现在应该为模块 C 创建表和所有迁移。
据我所知,迁移可以专用于特定项目。 Link .我看到的唯一问题是 ContextModelShapshot
。
最佳答案
给定 DbContext
的所有 Migration
类都需要在同一个程序集中。要将它们拆分到不同的程序集中,您需要单独的 DbContext
类。
您可能会找到 Using a Separate EF Core Migrations Project有趣的文档页面。
关于entity-framework - 将 EF Core 迁移拆分到多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48355992/