Entity framework core 实体框架核心迁移自定义历史记录表列

Entity framework core 实体框架核心迁移自定义历史记录表列,entity-framework-core,entity-framework-migrations,Entity Framework Core,Entity Framework Migrations,我试图弄清楚如何在Migrations history表中添加和设置自定义列的值。我已经了解了如何添加具有自定义SqlServerHistoryRepository的列,如下所示: class MyHistoryRepository : SqlServerHistoryRepository { public MyHistoryRepository(HistoryRepositoryDependencies dependencies) : base(dependencies) {

我试图弄清楚如何在Migrations history表中添加和设置自定义列的值。我已经了解了如何添加具有自定义SqlServerHistoryRepository的列,如下所示:

class MyHistoryRepository : SqlServerHistoryRepository
{
    public MyHistoryRepository(HistoryRepositoryDependencies dependencies) : base(dependencies)
    {            
    }

    protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
    {
        base.ConfigureTable(history);
        history.Property<DateTime>("Applied").HasDefaultValue(DateTime.Now);
        history.Property<string>("UserStamp");
    }
}`
类MyHistoryRepository:SqlServerHistoryRepository
{
公共MyHistoryRepository(HistoryRepositoryDependencies):基础(dependencies)
{            
}
受保护的覆盖无效配置表(EntityTypeBuilder历史记录)
{
基本配置表(历史记录);
history.Property(“Applied”).HasDefaultValue(DateTime.Now);
历史。财产(“用户印章”);
}
}`
我正在一个以.NET标准为目标的库中创建数据层。我为迁移创建了一个IDesignTimeDbContextFactory,如下所示

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyContext>
{
    public MyContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseSqlServer("connectionString",
            ob => ob.MigrationsAssembly(this.GetType().Assembly.GetName().Name))
            .ReplaceService<IHistoryRepository, MyHistoryRepository>();

        return new MyContext(optionsBuilder.Options);
    }
}
公共类MyDbContextFactory:IDesignTimeDbContextFactory
{
公共MyContext CreateDbContext(字符串[]args)
{
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseSqlServer(“connectionString”,
ob=>ob.MigrationsAssembly(this.GetType().Assembly.GetName().Name))
.ReplaceService();
返回新的MyContext(optionsBuilder.Options);
}
}

如何将UserStamp的值传递到迁移历史记录表中?

您可以使用依赖项注入将任何服务直接传递到
IHistoryRepository
的实现中

例如,要从文件中读取值,可以执行以下操作:

public class MyHistoryRepository : NpgsqlHistoryRepository
{
    private readonly IConfiguration _config;

    public MyHistoryRepository(
        HistoryRepositoryDependencies dependencies,
        IConfiguration config) : base(dependencies)
    {
        _config = config;
    }

    protected override void ConfigureTable(EntityTypeBuilder<HistoryRow> history)
    {
        base.ConfigureTable(history);
        history.Property<DateTime>("Applied").HasDefaultValue(DateTime.Now);
        history.Property<string>("UserStamp")
            .HasDefaultValue(_config["UserStamp"] ?? "");
    }
}

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyContext>
{
    public MyContext CreateDbContext(string[] args)
    {
        var services = new ServiceCollection();

        IConfiguration config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("config.json")
            .Build();

        // in your case this would probably be 'AddEntityFrameworkSqlServer'
        services.AddEntityFrameworkNpgsql();
        services.AddSingleton<IConfiguration>(config);
        services.AddScoped<IHistoryRepository, MyHistoryRepository>();

        var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
        optionsBuilder.UseNpgsql(config.GetConnectionString("DefaultConnection"))
            .UseInternalServiceProvider(services.BuildServiceProvider());

        return new MyContext(optionsBuilder.Options);
    }
}
公共类MyHistoryRepository:NpgsqlHistoryRepository
{
专用只读IConfiguration\u config;
公共MyHistoryRepository(
HistoryRepositoryDependencies,
IConfiguration配置):基本(依赖项)
{
_config=config;
}
受保护的覆盖无效配置表(EntityTypeBuilder历史记录)
{
基本配置表(历史记录);
history.Property(“Applied”).HasDefaultValue(DateTime.Now);
history.Property(“UserStamp”)
.HasDefaultValue(_config[“UserStamp”]??“”);
}
}
公共类MyDbContextFactory:IDesignTimeDbContextFactory
{
公共MyContext CreateDbContext(字符串[]args)
{
var services=newservicecolection();
IConfiguration config=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“config.json”)
.Build();
//在您的情况下,这可能是“AddEntityFrameworkSqlServer”
services.AddEntityFrameworkNpgsql();
services.AddSingleton(config);
services.addScope();
var optionsBuilder=new DbContextOptionsBuilder();
optionsBuilder.UseNpgsql(config.GetConnectionString(“DefaultConnection”))
.UseInternalServiceProvider(services.BuildServiceProvider());
返回新的MyContext(optionsBuilder.Options);
}
}