如何解决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
属性中包含相关的Test
或Ref
。我应该如何实施?
我想防止将
PollId
,TestId
和....等单独的ID添加到Notification
,因为我确信每次只有其中一个具有价值,所以我想要拥有一个RefId
和一个Ref
属性来代替它们。
解决方法
我不知道EntityFramework,但是您要求我回答这个问题。
您基本上是在重新发明polymorphic-associations,这不是一个好的关系设计。您可以阅读我过去有关此概念的一些答案:
- 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来说,答案都是相同的。您无法声明引用多个表的实际外键约束这一事实应该可以证明这种设计不正确。
从数据建模的角度来看,最简单的解决方案是为每个潜在的表引用创建一个独立的属性。在给定的行上,除其中之一外,所有这些都将为NULL。
我不知道EntityFramework如何支持这一点。 @AluanHaddad的建议听起来不错。
尽量不要破坏关系概念。沿着这条路是Inner-Platform Effect antipattern。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。