2015-02-05 76 views
1

我是第一次运行我的应用程序后登录到数据库中的代码第一个实体框架的新手,当我看到“__MigrationHistory”表时,我有点困惑。EF 6 Code First默认情况下,dbo架构中的__MigrationHistory

我现在明白了这个表的必要性,但不喜欢它在用户表中的标准dbo模式,我认为它是突兀而又有风险的。

我的第一个想法是将它移动到系统文件夹。当在EF环境下研究如何实现这一点时,我所能找到的就是如何将其从系统移至dbo。

我现在感觉__MigrationHistory应该默认在系统文件夹中创建......是这种情况吗?

默认情况下,如何配置我的上下文以管理/引用系统文件夹中的迁移历史记录表?

这是我的背景,我做错了什么或缺少一些配置?

public class MyContext : DbContext, IDataContext 
{ 
    public IDbSet<Entity> Entities { get; set; } 

    public MyContext() 
     : base("ConnectionString") 
    { 

    } 

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class 
    { 
     return base.Set<TEntity>(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 
+0

它实际上是用来在系统默认文件夹,但这种行为已被改变在EF 6中。 – Jessica 2015-02-05 23:00:34

回答

0

你可以尝试在你的后裔方法执行EXEC sys.sp_MS_marksystemobject __MigrationHistory使用context.Database.ExecuteSqlCommand();

2

没有为移动__MigrationHistory的技术。这表有它自己的上下文(System.Data.Entity.Migrations.History.HistoryContext),您可以覆盖:

public class MyHistoryContext : HistoryContext 
{ 
    public MyHistoryContext(DbConnection dbConnection, string defaultSchema) 
     : base(dbConnection, defaultSchema) 
    { 
    } 

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

然后,你需要register它:

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