微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决EF,如何有条件地包含一个导航属性,该导航属性的类型与另一个属性的值有关?

我有以下实体:

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; }
}

确定

  • Type对象的Notification属性等于Poll时,RefId将由PollId填充
  • 当类型等于Test时,refId将用TestId填充。

现在我要有条件地在Poll属性中包含相关的TestRef 。我应该如何实施?

我想防止将PollIdTestId和....等单独的ID添加Notification,因为我确信每次只有其中一个具有价值,所以我想要拥有一个RefId一个Ref属性来代替它们。

解决方法

我不知道EntityFramework,但是您要求我回答这个问题。

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

我倾向于回答MySQL问题,但是对于其他任何品牌的RDBMS来说,答案都是相同的。您无法声明引用多个表的实际外键约束这一事实应该可以证明这种设计不正确。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。