默认情况下,dbo架构中的EF 6 Code First __MigrationHistory

时间:2015-02-05 22:32:33

标签: c# sql-server entity-framework ef-code-first

我是Code First Entity框架的新手,在第一次运行我的应用程序后登录数据库时,当我看到“__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>();
    }
}

2 个答案:

答案 0 :(得分: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)); 
    } 
} 

答案 1 :(得分:0)

您可以尝试使用EXEC sys.sp_MS_marksystemobject __MigrationHistory

在种子方法中执行context.Database.ExecuteSqlCommand();