实体框架在子上下文中覆盖dbset

时间:2017-01-27 14:15:15

标签: c# entity-framework dbcontext

Phone19类继承Phone类并包含其他字段。这里的想法是使用TPH(每层次表的表)方法扩展现有的数据库模型。我通过PM控制台为两个上下文启用迁移,它们使用正确的上下文,但是当我向“父”迁移添加迁移时,会添加Phone19类的字段。有没有办法可以覆盖IDbset?我不能使它成为虚拟的并且稍后覆盖它,因为一个人正在使用Phone类而另一个正在使用类Phone19

有一个基本上下文,看起来像这样

public class CallTrackingDBContext : DbContext
{
    public IDbSet<Phone> Phones { get; set; }


    private void InitContext()
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
        Configuration.AutoDetectChangesEnabled = false;
            ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 100000;
    }

    public CallTrackingDBContext(DbConnection dbConnection) : base(dbConnection,false)
    {
        InitContext();
    }

    public CallTrackingDBContext() : base("CallTrackingDBContext")
    {
        InitContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    }
}

还有另一个上下文继承了前一个,应该覆盖Phones Dbset:

public class ClientContext19 : CallTrackingDBContext
{
    public new IDbSet<Phone19> Phones { get; set; }

    public ClientContext19(DbConnection dbConnection) : base(dbConnection)
    {
        InitContext();
    }

    public ClientContext19() : base("DBContext19")
    {

        InitContext();
    }


    private void InitContext()
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
        Configuration.AutoDetectChangesEnabled = false;
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 100000;
    }
}

1 个答案:

答案 0 :(得分:0)

使用Phone19NotMappedAttribute退出基于约定的模型。在新模型中,使用流畅的配置将其编织回来。

public class ClientContext19 : CallTrackingDbContext
{
  ...

  public override void OnModelCreating(DbModelBuilder dmb)
  {
    dmb.Entity<Phone>()
      .Map<Phone19>(m => m.Requires("discriminator").HasValue("Phone19"));
  }
} 

您可以自定义鉴别器列名称和值,或者甚至只需要Phone19上的某个属性具有将行标记为Phone19而不是Phone的值}。