是否可以使用[IsNull] / [Is Not Null]条件实现TPH继承?

时间:2012-11-05 19:25:41

标签: entity-framework

create table Test_Table
(
   ID int primary key identity,
   C1 nvarchar(100) NULL
)

Test_Table已映射到Test_1实体,并且是Test_2实体的父级

是否可以实现TPH继承,其中取决于鉴别器列C1是否具有空值,DB记录将实现为类型为Test_1的实体或实体为输入Test_2

为此,Test_1的歧视性列应设置为条件[C1] Is Not Null,而Test_2的歧视列应设置为条件[C1] is null。但问题是条件Is Not Null要求我们也将C1列映射到属性,而Is Null不允许C1也映射到属性。

那么是否可以仅使用条件映射来实现这样的条件?

谢谢

1 个答案:

答案 0 :(得分:0)

如标题所示,只要父类与null值相关联,并且子类具有非null(必需)值,就可以这样做。

使用代码优先的流畅映射:

public class Test_1
{
    public int ID { get; private set; }
}

public class Test_2
{
    public string C1 { get; set; }
}

protected override void OnModelCreating(DbModelBuilder dbm)
{
    dbm.Entity<Test_1>()
        .Map<Test_2>(m => m.Requires(t => t.C1).HasValue());
}

但是,在父级需要值的情况下,子级则不可能。这至少部分是因为它破坏了继承中的“is-a”关系:如果Test_2 具有相互矛盾的定义,那么它如何 - 具体来说,它排除了一个值父母要求的字段?