2016-10-04 2 views
1

__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>()); 

. 마이그레이션 내역의 데이터베이스 초기화 프로그램이 사용할 내역 컨텍스트를 선택하도록하려면 어떻게해야합니까?

답변

0

두 개의 서로 다른 어셈블리에 두 개의 서로 다른 DbContext 하위 클래스가있는 시스템이 있으며이 두 컨텍스트는 서로 다른 두 개의 HistoryContext를 사용합니다. 저를위한 트릭은 두 개의 다른 HistoryContext 테이블을 사용하고 각 DbContext 하위 클래스의 DbMigrationsConfiguration 하위 클래스가 데이터베이스가 초기화 될 때 올바른 HistoryContext 하위 클래스를 등록하는 코드를 포함하도록하는 것이 었습니다.

기본 DB 마이그레이션 클래스 :

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(); 
    } 

} 
관련 문제