[英]Multi-level derived EF DataContext
假設我有一個基本的datacontext:
public class BaseContext : DbContext {
public DbSet<User> Users { get; set; }
public BaseContext(): base("default")
{
Database.SetInitializer(new BaseContextInitializer());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new UserConfiguration());
}
}
public class BaseContextInitializer : IDatabaseInitializer<BaseContext>
{
private static readonly Lazy<bool> ShouldInitializeDatabase = new Lazy<bool>(() =>
string.IsNullOrWhiteSpace(
ConfigurationManager.AppSettings[
"InitializeDatabase"]));
public void InitializeDatabase(BaseContext context)
{
if (!ShouldInitializeDatabase.Value) return;
bool dataBaseExists;
using (new TransactionScope(TransactionScopeOption.Suppress))
dataBaseExists = context.Database.Exists();
if (dataBaseExists)
{
try
{
if (context.Database.CompatibleWithModel(true))
return;
context.Database.Delete();
}
catch (NotSupportedException)
{
context.Database.Delete();
}
}
context.Database.Create();
context.Database.ExecuteSqlCommand("alter table Users add constraint UniqueUserEmail unique (Email)");
Seed(context);
}
protected virtual void Seed(BaseContext context)
{
// seeding code
}
}
而且我正在嘗試創建帶有幾個其他集合的派生數據上下文:
public class DerivedContext : BaseContext {
public DbSet<Admin> Admins { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new AdminConfiguration());
}
}
我正在使用SimpleInjector並注冊上下文(用於服務中),如下所示:
container.RegisterPerWebRequest<DerivedContext, DerivedContext>();
這樣,僅創建BaseContext
的表。
如果我添加此:
container.RegisterPerWebRequest<BaseContext, DerivedContext>();
container.RegisterPerWebRequest<DerivedContext, DerivedContext>();
那么將創建派生集,但初始化器不會運行。
我想念什么? 做這樣的事情的正確模式是什么?
因此,這似乎可行,並且不涉及在派生類中復制所有內容:
// make it generic
public class BaseContextInitializer<T> : IDatabaseInitializer<T>
{
// ...
public void InitializeDatabase(T context)
{
// ...
}
}
// now pass the derivedcontext in the derived initializer
public class DerivedContextInitializer : BaseContextInitializer<DerivedContext>
{
// overrides etc. etc.
}
// set the initializer to be the derived one
public class DerivedContext : BaseContext {
public DbSet<Admin> Admins { get; set; }
public DerivedContext(): base("default")
{
Database.SetInitializer(new DerivedContextInitializer());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new AdminConfiguration());
}
}
因此,這會使東西保持干燥和干凈。 由於某種原因,我仍然無法擺脫骯臟的感覺。
坐在上面一段時間后,我可以驗證這種方法是否有效。 但是,EF實際上並沒有像人們期望的那樣構建繼承模型。 從長遠來看,最好不要有繼承並且只有一個上下文,即使這意味着在開始時要進行一些代碼復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.