将EF Core迁移拆分为多个项目

时间:2018-01-20 12:12:11

标签: entity-framework entity-framework-core

是否可以将(不移动到单个类库项目)迁移到多个.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

1 个答案:

答案 0 :(得分:2)

给定Migration的所有DbContext类都需要位于同一个程序集中。要在不同的程序集中拆分它们,您需要单独的DbContext类。

您可能会发现Using a Separate EF Core Migrations Project doc页面很有趣。