我正在使用Entity Framework 5.0,
情景
“组织”有“客户”列表和“期间”列表和“CurrentPeriodID”< / strong>在每个期间开始时,部分或全部“客户”与“期间”相关联,这是我使用链接表完成的好的,所以当我“组织 - &gt;期间 - &gt;客户”时,我会得到“期间”的“客户”列表
接下来我需要将一些对象(“活动”)添加到“客户端”以获取“期间”,这样我才能< strong>“组织 - &gt;期间 - &gt;客户端 - &gt;激活”这不会是唯一一个最终将需要添加到“客户端的其他几个导航属性“和”活动“,所有这些都必须”期间“相关,我也必须能够(如果可能的话)。 “Organisation-&GT;周期 - 活动”
问题
“组织 - >期间 - 客户”实施“活动”的最佳方法是什么?我不介意它是什么方式完成Code First逆向工程等。另外在创建“Organization”对象时,我可以使用“CurrentPeriodID”加载当前的“Period”对象值,存储在“Organization”对象中。
由于
答案 0 :(得分:0)
对我来说,这听起来像是需要一个连接Period
,Client
和Activity
的其他实体,我们称之为ClientActivityInPeriod
。该实体 - 以及相应的表 - 将具有三个外键和三个引用(并且没有集合)。我想让那个实体的主键是三个外键的组合,因为我认为这个组合必须是唯一的。它看起来像这样(在Code-First风格中):
public class ClientActivityInPeriod
{
[Key, ForeignKey("Period"), Column(Order = 1)]
public int PeriodId { get; set; }
[Key, ForeignKey("Client"), Column(Order = 2)]
public int ClientId { get; set; }
[Key, ForeignKey("Activity"), Column(Order = 3)]
public int ActivityId { get; set; }
public Period Period { get; set; }
public Client Client { get; set; }
public Activity Activity { get; set; }
}
所有三个外键都是必需的(因为属性不可为空)。
Period
,Client
和Activity
可以拥有引用此实体的集合(但他们不需要),例如Period
:
public class Period
{
[Key]
public int PeriodId { get; set; }
public ICollection<ClientActivityInPeriod> ClientActivities { get; set; }
}
您不能拥有Clients
中Period
的集合等导航属性,这些属性将包含在给定时间段内具有任何活动的所有客户端,因为它需要具有来自{{的外键1}}到Client
或Period
和Client
之间的多对多链接表。仅当客户端具有Period
中的活动时,才会填充外键或链接表。 EF和数据库都无法帮助您实现这样的业务逻辑。如果在期间添加或删除活动,则必须对此进行编程并确保正确更新关系 - 这容易出错并且存在数据一致性的风险。
相反,您将通过查询而不是导航属性来获取在给定时间段Period
内具有活动的客户端,例如:
1