[asp.net-mvc]多层次派生 EF DataContext

发布时间: 2016/10/9 6:03:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

比方说我有基地 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
    }
}

我试图创建派生的 datacontext 与几个额外的多组︰

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>();

然后创建派生的集但不运行初始值设定项。

我错过了什么?和适当的模式来做这样的事情是什么?

解决方法 1:

因此,这似乎工作,不涉及复制在派生类中的一切︰

// 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 真的不是为了因子中的继承模型,以及人们会期望 (也许很好的理由)。它可能会更好在长远来看不具有继承性和有一个单一的背景下,即使它意味着在开始一些代码重复。

赞助商