entity-framework-core - Entity Framework Core Migrations 自定义历史表列
问题描述
我试图弄清楚如何在迁移历史记录表中添加和设置自定义列的值。我已经想出了如何使用自定义 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");
}
}`
我正在以 .NET Standard 为目标的库中创建我的数据层。我为看起来像这样的迁移创建了一个 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);
}
}
如何将 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);
}
}
推荐阅读
- php - HTTP 错误 400 错误请求电报机器人 api
- spring - Kotlin Spring Boot 教程中的 web 依赖是什么?
- python - 如何在 MacOS 上删除 distutils 安装的项目
- apache-kafka-streams - KSQL 是在后台发出远程请求,还是 Table 实际上是全局 KTable?
- android - 在 Android 上获取动态壁纸的图像/屏幕截图?
- r - 如何在 R 中被动更改 ShinyDashboard 框的标题?
- arrays - Excel 索引匹配或类似的东西可以匹配 1 行但返回另一行吗?
- javascript - 这个 javascript 闭包有什么问题?
- python - Ghostscript 将 .ps 文件转换为 .png 文件会给出一个空图像(全黑)
- sql - 如何根据另一个表中的值创建重复记录