【问题标题】:Entity Framework Core Migrations Custom History Table ColumnEntity Framework Core Migrations 自定义历史表列
【发布时间】:2018-08-27 02:43:32
【问题描述】:

我试图弄清楚如何在迁移历史记录表中添加和设置自定义列的值。我已经想出了如何使用这样的自定义 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 的值传递到迁移历史记录表中?

【问题讨论】:

    标签: entity-framework-core entity-framework-migrations


    【解决方案1】:

    您可以使用依赖注入将任何服务直接传递到您的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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2022-01-11
      • 2022-09-27
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多