且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何向 __MigrationHistory 表添加额外的列?

更新时间:2023-11-30 23:20:34

首先您需要为历史记录行实体创建一个新类.例如:

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

接下来我们需要一个上下文,就像我们对普通 EF 操作所做的一样,不过这次我们继承自 HistoryContext:

Next we need a context, same as we do for normal EF operations, this time however we inherit from 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)); 
    }
}

最后,通过修改我们的 web.config 来应用配置:(您必须填写自己的命名空间和应用程序集:

And finally, make the configuration apply by modifying our web.config: (you will have to fill in your own namespace and application assembly:

<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