簡體   English   中英

多級派生EF DataContext

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM