0

我正在使用实体框架 5.0,

设想

“组织”有一个“客户”列表和一个“周期”列表和一个“CurrentPeriodID”在每个周期开始时,一些或所有“客户”与该“周期”相关联,我已经使用链接表,这可以正常工作,所以当我执行"Organisation->Period->Clients"时,我会得到"Period""Clients"列表。

接下来我需要为“期间”添加一些对象(“活动)到“客户” ,所以我得到“组织->期间->客户->激活”这不会是唯一的,最终会有几个其他需要添加到“客户”“活动”的导航属性,并且所有这些都必须与“期间”相关,我还必须能够(如果可能)“组织->期间-活动”

问题

“Organisation->Period-Client”实现“活动”的最佳方式是什么,我不介意它是如何完成的 Code First 逆向工程等。同样在“Organisation”对象的创建上我使用存储在“Organisation”对象中的“CurrentPeriodID”值加载当前的“Period”对象。

谢谢

4

1 回答 1

0

对我来说,这听起来像是您需要一个额外的实体来连接,Period我们称之为。该实体 - 以及相应的表 - 将具有三个外键和三个引用(并且没有集合)。我会将该实体的主键设为三个外键的组合,因为我猜该组合必须是唯一的。它看起来像这样(以 Code-First 风格):ClientActivityClientActivityInPeriod

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

您不能拥有像Clientsin集合这样的导航属性Period,其中包含在给定期间内有任何活动的所有客户端,因为它需要具有 from Clientto的外键或andPeriod之间的多对多链接表。只有当客户端有活动时,才会填充外键或链接表。EF 和数据库都不会帮助您处理这样的业务逻辑。您必须对此进行编程,并确保在该期间添加或删除活动时正确更新关系 - 这容易出错并且存在数据一致性风险。ClientPeriodPeriod

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

var clientsWithActivitiesInPeriod1 = context.Periods
    .Where(p => p.PeriodId == 1)
    .SelectMany(p => p.ClientActivities.Select(ca => ca.Client))
    .Distinct()
    .ToList();
于 2013-05-06T18:43:14.487 回答