簡體   English   中英

實體框架:使用多個自定義歷史上下文

[英]Entity Framework: Using Multiple Custom History Context

我有將 __MigrationHistory 映射到現有數據庫表的代碼。

namespace Alvin_CMS.Migrations
{
    public class CustomHistoryContext : HistoryContext
    {
        public CustomHistoryContext(DbConnection dbConnection, string defaultSchema)
        : base(dbConnection, defaultSchema)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<HistoryRow>().ToTable(tableName: "__MigrationHistory", schemaName: "dbo");
            //modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
        }
    }

    public class CustomHistoryConfiguration : DbConfiguration
    {
        public CustomHistoryConfiguration()
        {
            this.SetHistoryContext("System.Data.SqlClient",
            (connection, defaultSchema) => new CustomHistoryContext(connection, "dbo"));
        }
    }
}

我還有另一個自定義歷史上下文:

namespace EAccounting.Migrations
{
    public class CustomHistoryContext : HistoryContext
    {
        public CustomHistoryContext(DbConnection dbConnection, string defaultSchema)
            : base(dbConnection, defaultSchema)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<HistoryRow>().ToTable(tableName: "__MigrationHistory", schemaName: "EAccounting");
            //modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
        }
    }

    public class CustomHistoryConfiguration : DbConfiguration
    {
        public CustomHistoryConfiguration()
        {
            this.SetHistoryContext("System.Data.SqlClient",
            (connection, defaultSchema) => new CustomHistoryContext(connection, "EAccounting"));
        }
    }
}

我在我的代碼中調用它:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<EAccounting.Models.EAccountingMigrationDBContext, EAccounting.Migrations.Configuration>()); 

我有多個數據庫,它們有自己的自定義遷移歷史上下文。 如何讓遷移歷史的數據庫初始值設定項選擇他們將使用的歷史上下文?

我有一個系統,在兩個不同的程序集中有兩個不同的 DbContext 子類,這兩個上下文使用兩個不同的 HistoryContext。 我的訣竅是使用兩個不同的 HistoryContext,並確保每個 DbContext 子類的 DbMigrationsConfiguration 子類包含在數據庫初始化時注冊正確的 HistoryContext 子類的代碼。

基礎數據庫遷移類:

   public class DbMigrationsConfigurationBase<TContext> : DbMigrationsConfiguration<TContext>, IDbMigrationsConfiguration<TContext> where TContext : DbContext, IDbContext
{
    public DbMigrationsConfigurationBase(Func<DbConnection, string, HistoryContext> historyContextFactory)
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
        MigrationsDirectory = @"Migrations";
        RegisterHistoryContextFactory(historyContextFactory);
    }

    private void RegisterHistoryContextFactory(Func<DbConnection, string, HistoryContext> historyContextFactory)
    {
        foreach (ConnectionStringSettings connectionString in ConfigurationManager.ConnectionStrings)
        {
            if (!string.IsNullOrEmpty(connectionString.ProviderName))
            {
                SetHistoryContextFactory(connectionString.ProviderName, historyContextFactory);
            }
        }
    }

    public IDbMigrator GetMigrator()
    {
        return new DbMigratorWrapper(new DbMigrator(this));
    }
}

特定於上下文的遷移配置類示例:

    public sealed class MySpecialDatabaseMigrationConfiguration : DbMigrationsConfigurationBase<MySpecialDatabase>
{
    private static readonly Func<DbConnection, string, HistoryContext> HistoryContextFactory =
        (connection, schema) => new MySpecialDatabaseHistoryContext(connection, schema);
    public MySpecialDatabaseMigrationConfiguration(): base(HistoryContextFactory)
    {
        ContextKey = "MyNamespace.MySpecialDatabase";
    }
}

然后在我的數據庫初始化程序中,我確保在初始化時實例化遷移配置...

    public class CreateOrMigrateDatabaseInitializer<TContext, TConfiguration> : IDatabaseInitializer<TContext>
    where TContext : DbContext, IDbContext
    where TConfiguration : IDbMigrationsConfiguration<TContext>, new()
{
    private readonly string _connection;

    public CreateOrMigrateDatabaseInitializer(string connection, ILogger logger = null)
    {
        Contract.Requires(!string.IsNullOrEmpty(connection), "connection");
        _connection = connection;
    }

    public void InitializeDatabase(TContext context)
    {
        Contract.Requires(context != null, "context");

        IDbMigrationsConfiguration<TContext> configuration = new TConfiguration()
        {
            TargetDatabase = new DbConnectionInfo(_connection)
        };

        if (!context.Database.Exists() || !context.Database.CompatibleWithModel(throwIfNoMetadata: false))
        {
            var migrator = configuration.GetMigrator();

            foreach (string s in migrator.GetPendingMigrations())
            {
                migrator.Update(s);
            }
        }

        Seed(context);

        context.SaveChanges();
    }

} 

我首先使用代碼運行 6.2.0。 我只是為每個 DbContext 使用不同的架構

在 DbContext 中,我設置了默認架構

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("schema1");
    }

這會導致每個 DbContext 有一個單獨的 __MigrationHistory 表

您必須在上下文上方添加屬性,如下所示:

[DbConfigurationType(typeof(CustomeConfiguration))]

然后嘗試在全局 asax 或應用程序配置中初始化上下文之前注冊配置。

DbConfiguration.SetConfiguration(new TDBConfigurations());

參考: https : //docs.microsoft.com/en-us/ef/ef6/fundamentals/configuring/code-based

暫無
暫無

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

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