我開始用asp.net核心開發模塊化系統。系統有模塊加載器,模塊安裝程序等。每個模塊都有自己的數據庫模型,可以動態添加到Context

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      var 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);
}

private static void RegisterEntities(ModelBuilder modelBuilder, IEnumerable<Type> typeToRegisters)
{
      var entityTypes = typeToRegisters.Where(x => x.GetTypeInfo().IsSubclassOf(typeof(IEntity<>)) && !x.GetTypeInfo().IsAbstract);
      foreach (var type in entityTypes)
      {
          modelBuilder.Entity(type);
      }
}

但是,如果沒有遷移,EF Core就無法運行。我可以為所有模塊創建所有遷移文件並在start中運行它,但這是錯誤的。也許一個模塊根本不需要安裝。

有沒有辦法讓每個模塊都有自己的遷移?或以任何方式解決這個問題?

對不起,我的英語不好

謝謝

一般承認的答案

但是,如果沒有遷移,EF Core就無法運行。

有用! EF Core與EF 6.x不同,它沒有自動遷移概念。因此,除非您要求使用context.Database.Migrate()方法應用掛起的遷移,否則它根本不會檢查遷移歷史記錄表。因此EF Core不需要顯式遷移。要測試它,只需運行您的應用程序,然後您將看到它會抱怨缺少與您實際執行的查詢相關的表和字段。它根本不會抱怨失踪的遷移歷史。在這種情況下,您可以單獨創建數據庫表,而無需使用遷移,它可以正常工作。因此,要獨立地進行遷移(這是您的問題),請創建一個類似的界面

public interface  IModuleDatabaseScript
{
   string CreateSqlSchema { get;}
}

然後你的模塊應該實現這個接口並提供create database / create table / alter table / drop table等。然後你的上下文應該讀取這些腳本,然後使用context.Database.ExecuteSqlCommand方法運行它們。您應該在將模塊加載到內存一次時執行此操作。在這種情況下,每個模塊都可以有或沒有(只返回空的CreateSqlSchema字符串)數據庫創建策略,而不使用EF Core的遷移機制。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow