EF,如何有条件地包含与另一个 属性 的值相关的导航 属性?

EF, How to conditionally include a navigation property that type of it related to value of another property?

我有以下实体:

public class Notification
{
    public int Id { get; set; }
    public string Title { get; set; }
    public Guid RefId { get; set; }
    public Object Ref { get; set; } //  << The navigation property: Sometime its type is Poll and sometime is Test, maybe I add other types too 
    public NotifTypes Type { get; set; }
}

public enum NotifTypes
{
    Poll=1,
    Test=2,
    // Other NotifTypes here
}

//-------------------------------------------------------------------

public class Test
{
    public int Id { get; set; }
    public string Title { get; set; }

    public IEnumerable<Notification> { get; set; }
}

public class Poll
{
    public int Id { get; set; }
    public string Answer1 { get; set; }
    public string Answer2 { get; set; }

    public IEnumerable<Notification> { get; set; }
}

好的,

现在我想有条件地在Ref属性中包含相关的PollTest。我该如何实施?

I want prevent to add separate Ids like PollId, TestId and.... to Notification because I'm sure that each time just one of them has value, so I want have one RefId and one Ref property instead of them.

我不知道EntityFramework,但你让我回答这个问题。

您基本上是在重新发明 ,这不是一个好的关系设计。您可以阅读我过去关于这个概念的一些回答:

  • Possible to do a MySQL foreign key to one of two possible tables?
  • Why can you not have a foreign key in a polymorphic association?
  • MySQL - Conditional Foreign Key Constraints

我倾向于回答 MySQL 个问题,但答案对于任何其他品牌的 RDBMS 都是一样的。您不能声明引用多个 table 的实际外键约束这一事实应该是这种设计不正确的线索。

从数据建模的角度来看,最简单的解决方案是为每个潜在的 table 引用创建一个独立的属性。在给定的行上,除其中之一外,所有这些都将为 NULL。

我不知道 EntityFramework 如何支持这一点。 @AluanHaddad 的建议听起来不错。

尽量不要打破关系概念。沿着那条路是 Inner-Platform Effect antipattern.