簡體   English   中英

具有多個提供程序的EF Core遷移始終運行SQL Server腳本

[英]EF Core Migration with multiple provider always runs SQL Server scripts

我首先使用EF Core Code,並且在使用多個數據庫提供程序(SQL Server和MySql)時遇到問題。 即使選擇使用MySql DB提供程序,也會使用SQL Server遷移文件。

檢查樣本項目

就我而言,我對兩個提供程序都使用了相同的遷移,但是有時我需要手動更改遷移文件。 例如,為兩個提供程序添加了注釋(或將某些字段的類型(例如varchar更改為nvarchar ))。

Id = table.Column<int>(nullable: false)
           .Annotation("MySql:ValueGeneratedOnAdd", true)
           .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),

對我來說很好

使用Entity Framework核心編寫特定於提供程序的遷移,數據庫初始化程序和服務可能是一項艱巨的任務。 使用AdaptiveClient可以大大簡化該過程。 AdaptiveClient是與Autofac一起使用的實用程序,用於針對多個數據庫提供程序或傳輸提供服務層。 AdaptiveClient.EntityFrameworkCore是一個加載項,其中包含用於使用Entity Framework Core的實用程序。 概括地說,這是AdaptiveClient的工作方式:

IMigrationContext是一個占位符接口,允許您將DbContext與特定的提供程序(MSSQL,MySql等)關聯,以創建遷移。 IDbContextOptions是一個占位符接口,允許您關聯特定於您的提供程序的DbContextOptions實現。 RegistrationHelper是一個實用程序,可簡化在Autofac中注冊組件的過程。 RegisterMigrationContext是一種可以調用的方法,可以輕松地注冊特定於提供程序的遷移上下文。

要創建特定於提供程序的遷移,請為要定位的每個數據庫提供程序創建一個類。 這些類從您的DbContext派生並實現IMigrationContext (沒有成員):

public class MyDbContext_MSSQL : MyDbContext, IMigrationContext
{
    public MyDbContext_MSSQL(DbContextOptions options) : base(options)
    {

    }
}   


public class MyDbContext_MySQL : MyDbContext, IMigrationContext
{
    public MyDbContext_MySQL(DbContextOptions options) : base(options)
    {

    }
}

上面的示例是完整的-您不必編寫任何其他代碼。 不需要為每個提供程序創建單獨的DbContext(除非您希望這樣做)。 您需要為每個提供程序創建一個類的原因是因為當您運行dotnet ef migrations add...時,EF會在您的程序集上進行反映以找到正確的DbContext。

創建包裝DbContextOptions類並實現IDbContextOptions

public class DbContextOptions_MSSQL : IDbContextOptions
{
    public DbContextOptions Options { get; set; }

    public DbContextOptions_MSSQL(string connectionString)
    {
        DbContextOptionsBuilder builder = new DbContextOptionsBuilder();
        builder.UseSqlServer(connectionString);
        Options = builder.Options;
    }
}


public class DbContextOptions_MySQL : IDbContextOptions
{
    public DbContextOptions Options { get; set; }

    public DbContextOptions_MySQL(string connectionString)
    {
        DbContextOptionsBuilder builder = new DbContextOptionsBuilder();
        builder.UseMySql(connectionString);
        Options = builder.Options;
    }
}

使用AdaptiveClient RegistrationHelper向Autofac注冊您的類:

registrationHelper.RegisterMigrationContext<Database.Db_MSSQL>(API_Name.MyAPI, DataBaseProviderName.MSSQL);
registrationHelper.RegisterMigrationContext<Database.Db_MySQL>(API_Name.MyAPI, DataBaseProviderName.MySQL);

registrationHelper.RegisterDbContextOptions<DbContextOptions_MSSQL>(DataBaseProviderName.MSSQL);
registrationHelper.RegisterDbContextOptions<DbContextOptions_MySQL>(DataBaseProviderName.MySQL);    

在上面的代碼中,API_Name只是一個常量,可以解析為簡單的字符串,例如“ MyApplicationName”。 與DataBaseProviderName.MSSQL和.MySQL相同。 它們是可解析為“ MSSQL”或“ MySQL”的字符串常量。

現在,這是最重要的部分:正如使用“ MSSQL”或“ MySQL”之類的鍵注冊應用程序的組件一樣,您也使用這些相同的常量注冊應用程序的連接字符串。

這使Autofac可以僅基於當前用於應用程序的連接字符串來解析正確的特定於提供程序的特定組件或特定於傳輸的組件。 您可以在此處閱讀整個過程。

您可以在Zamagon演示中看到完整的工作示例。 該演示說明了遷移,數據庫初始化程序以及用於集成測試的拖放方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM