实体框架链接表

时间:2013-05-06 14:03:09

标签: entity-framework-5 hyperlink

我正在使用Entity Framework 5.0,

情景

“组织”“客户”列表和“期间”列表和“CurrentPeriodID”< / strong>在每个期间开始时,部分或全部“客户”“期间”相关联,这是我使用链接表完成的好的,所以当我“组织 - &gt;期间 - &gt;客户”时,我会得到“期间”的“客户”列表

接下来我需要将一些对象(“活动”)添加到“客户端”以获取“期间”,这样我才能< strong>“组织 - &gt;期间 - &gt;客户端 - &gt;激活”这不会是唯一一个最终将需要添加到“客户端的其他几个导航属性“”活动“,所有这些都必须”期间“相关,我也必须能够(如果可能的话)。 “Organisation-&GT;周期 - 活动”

问题

“组织 - >期间 - 客户”实施“活动”的最佳方法是什么?我不介意它是什么方式完成Code First逆向工程等。另外在创建“Organization”对象时,我可以使用“CurrentPeriodID”加载当前的“Period”对象值,存储在“Organization”对象中。

由于

1 个答案:

答案 0 :(得分:0)

对我来说,这听起来像是需要一个连接PeriodClientActivity的其他实体,我们称之为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; }
}

所有三个外键都是必需的(因为属性不可为空)。

PeriodClientActivity可以拥有引用此实体的集合(但他们不需要),例如Period

public class Period
{
    [Key]
    public int PeriodId { get; set; }

    public ICollection<ClientActivityInPeriod> ClientActivities { get; set; }
}

您不能拥有ClientsPeriod的集合等导航属性,这些属性将包含在给定时间段内具有任何活动的所有客户端,因为它需要具有来自{{的外键1}}到ClientPeriodClient之间的多对多链接表。仅当客户端具有Period中的活动时,才会填充外键或链接表。 EF和数据库都无法帮助您实现这样的业务逻辑。如果在期间添加或删除活动,则必须对此进行编程并确保正确更新关系 - 这容易出错并且存在数据一致性的风险。

相反,您将通过查询而不是导航属性来获取在给定时间段Period内具有活动的客户端,例如:

1