現(xiàn)在的情況您好,我有一個 dotnet 標(biāo)準(zhǔn)庫,我在其中使用EF Core 2.1.1(代碼優(yōu)先方法)訪問持久層。為了創(chuàng)建遷移,我使用了一個單獨(dú)的 dotnet 核心控制臺應(yīng)用程序(在同一個解決方案中),其中包含一個IDesignTimeDbContextFactory<T>實(shí)現(xiàn)。有必要播種一些數(shù)據(jù),我想以一種舒適的方式實(shí)現(xiàn)它,因?yàn)閷聿シN的數(shù)據(jù)將被擴(kuò)展或修改。因此,在實(shí)現(xiàn)中,IEntityTypeConfiguration我使用擴(kuò)展方法.HasData()獲取要播種的對象數(shù)組。該數(shù)組將從一個單獨(dú)的類(TemplateReader),它從 JSON 文件加載對象(將在其中完成擴(kuò)展和修改工作)。因此,可以修改 JSON 文件的內(nèi)容并添加一個新的遷移,該遷移將包含對 Insert ( modelBuilder.InsertData())、Update ( modelBuilder.UpdateData()) 或 Delete ( modelBuilder.DeleteData()) 語句的生成代碼。因?yàn)槲也粫l(fā)送 JSON 文件并且我想避免加載序列化數(shù)據(jù)以進(jìn)行播種和執(zhí)行.HasData(),所以我想使用一個bool將由DbContext構(gòu)造函數(shù)提供的值。如果不需要為遷移(和.HasData())調(diào)用種子,為了避免使用 bool 值,我使用默認(rèn)值 false 實(shí)現(xiàn)了一個重載的構(gòu)造函數(shù)。此外,我不會使用,OnConfiguring因?yàn)槲蚁腱`活設(shè)置DbContextOptions<T> 對象在我的 IoC 容器中或單獨(dú)用于測試。代碼以下代碼包含重命名的變量,以更加匿名地了解項(xiàng)目內(nèi)容,但代表當(dāng)前實(shí)現(xiàn)的邏輯。MyDesignTimeDbContextFactory:public class MyDesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDbContext>{ public MyDbContext CreateDbContext(string[] args) { var connectionString = ConfigurationManager.ConnectionStrings["SqlServer"].ConnectionString; var contextOptionsBuilder = new DbContextOptionsBuilder<MyDbContext>() .UseSqlServer(connectionString); return new MyDbContext(contextOptionsBuilder.Options, true); }}我的數(shù)據(jù)庫上下文:public sealed class MyDbContext : DbContext{ private readonly bool _shouldSeedData; public DbSet<Content> Contents { get; set; } public DbSet<Template> Templates { get; set; } public MyDbContext(DbContextOptions<MyDbContext> options, bool shouldSeedData = false) : base(options) { ChangeTracker.LazyLoadingEnabled = false; _shouldSeedData = shouldSeedData; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("mySchema"); modelBuilder.ApplyConfiguration(new TemplateTypeConfiguration(_shouldSeedData)); base.OnModelCreating(modelBuilder); }}
1 回答

小唯快跑啊
TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個贊
OnModelCreating是不是由基引發(fā)的DbContext構(gòu)造函數(shù)調(diào)用,所以絕對是節(jié)省了傳遞的參數(shù)類成員沒有問題。
在您的具體場景中,OnModelCreating由ChangeTracker在存儲傳遞的參數(shù)之前訪問屬性觸發(fā):
public MyDbContext(DbContextOptions<MyDbContext> options, bool shouldSeedData = false) :
base(options)
{
ChangeTracker.LazyLoadingEnabled = false; // <--
_shouldSeedData = shouldSeedData;
}
只需更換線路即可解決問題。通常,在訪問任何上下文屬性之前始終初始化您的類成員。
- 1 回答
- 0 關(guān)注
- 276 瀏覽
添加回答
舉報(bào)
0/150
提交
取消