简体   繁体   English

如何在__MigrationHistory表中添加其他列?

[英]How do I add an additional column to the __MigrationHistory table?

Per Customizing the Migrations History Table , I should be able to add a column, however I'm not able to find any examples on how to actually add the new column. 根据自定义迁移历史记录表 ,我应该能够添加一列,但是我无法找到有关如何实际添加新列的任何示例。

I'm mostly confused about where to put the actual property and how to configure it to the existing __MigrationHistory table. 我很担心放置实际属性的位置以及如何将其配置到现有的__MigrationHistory表。 From the documentation, I can customize the table configuration like so.. 从文档中,我可以自定义表配置。

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

...but I can't modify the HistoryRow entity. ...但我无法修改HistoryRow实体。

Am I supposed to add a new derived type based on the HistoryRow entity? 我应该根据HistoryRow实体添加新的派生类型吗?

First you need to create a new class for your history row entity. 首先,您需要为历史记录行实体创建一个新类。 For example: 例如:

public sealed class MyHistoryRow : HistoryRow
{
    //We will just add a text column
    public string MyColumn { get; set; }
}

Next we need a context, same as we do for normal EF operations, this time however we inherit from HistoryContext : 接下来我们需要一个上下文,就像我们对普通EF操作一样,但是这次我们继承了HistoryContext

public class MyHistoryContext : HistoryContext
{
    //We have to 'new' this as we are overriding the DbSet type
    public new DbSet<MyHistoryRow> History { get; set; }

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

    //This part isn't needed but shows what you can do
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //Rename the table and put it in a different schema. Our new table
        //will be called 'admin.MigrationHistory'
        modelBuilder.Entity<MyHistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");

        //Rename one of the columns for fun
        modelBuilder.Entity<MyHistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
    }
} 

Now to wire them up, we need to configure it, so first we set up the configuration: 现在要连接它们,我们需要配置它,所以首先我们设置配置:

public class MyConfiguration : DbConfiguration
{
    public MyConfiguration()
    {
        //Set our new history context to be the one that gets used
        this.SetHistoryContext("System.Data.SqlClient",
            (connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema)); 
    }
}

And finally, make the configuration apply by modifying our web.config: (you will have to fill in your own namespace and application assembly: 最后,通过修改我们的web.config来使配置适用:(您必须填写自己的命名空间和应用程序程序集:

<entityFramework codeConfigurationType="Namespace.MyConfiguration, ApplicationAssembly">
    ...snipped...
</entityFramework>

A side effect of doing this is that if/when you enable migrations, you need to explicitly state the context you are working with. 这样做的副作用是,如果/当您启用迁移时,您需要明确说明您正在使用的上下文。 This is obviously because you now have two context types in your assembly (unless you split them out.) So you now need to run a command like this: 这显然是因为你现在在程序集中有两种上下文类型(除非你将它们拆分出来。)所以你现在需要运行这样的命令:

enable-migrations -ContextTypeName Namespace.YourContextClass

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM