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; }
}
好的,
- 当
Notification
对象的Type
属性等于Poll
时,RefId
会补一个PollId
- 当类型等于
Test
时,refId
将填充 TestId
。
现在我想有条件地在Ref
属性中包含相关的Poll
或Test
。我该如何实施?
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,但你让我回答这个问题。
您基本上是在重新发明 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 都是一样的。您不能声明引用多个 table 的实际外键约束这一事实应该是这种设计不正确的线索。
从数据建模的角度来看,最简单的解决方案是为每个潜在的 table 引用创建一个独立的属性。在给定的行上,除其中之一外,所有这些都将为 NULL。
我不知道 EntityFramework 如何支持这一点。 @AluanHaddad 的建议听起来不错。
尽量不要打破关系概念。沿着那条路是 Inner-Platform Effect antipattern.
我有以下实体:
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; }
}
好的,
- 当
Notification
对象的Type
属性等于Poll
时,RefId
会补一个PollId
- 当类型等于
Test
时,refId
将填充TestId
。
现在我想有条件地在Ref
属性中包含相关的Poll
或Test
。我该如何实施?
I want prevent to add separate Ids like
PollId
,TestId
and.... toNotification
because I'm sure that each time just one of them has value, so I want have oneRefId
and oneRef
property instead of them.
我不知道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 都是一样的。您不能声明引用多个 table 的实际外键约束这一事实应该是这种设计不正确的线索。
从数据建模的角度来看,最简单的解决方案是为每个潜在的 table 引用创建一个独立的属性。在给定的行上,除其中之一外,所有这些都将为 NULL。
我不知道 EntityFramework 如何支持这一点。 @AluanHaddad 的建议听起来不错。
尽量不要打破关系概念。沿着那条路是 Inner-Platform Effect antipattern.