【发布时间】:2016-01-22 09:42:02
【问题描述】:
我以两种方式尊重实体“监控”:
- 作为公司监控列表的一部分
- 作为对公司的有效(= 当前选择)监控
public class Company
{
[Key]
[DataMember]
public virtual Guid CompanyId { get; set; }
[DataMember]
public virtual Guid? MonitoringId { get; set; }
[DataMember]
[ForeignKey("MonitoringId")]
public virtual Monitoring ActiveMonitoring { get; set; }
[DataMember]
public virtual ICollection<Monitoring> Monitorings { get; set; }
}
public class Monitoring
{
[Key]
[DataMember]
public virtual Guid MonitoringId { get; set; }
[DataMember]
public virtual Guid CompanyId { get; set; }
[DataMember]
[ForeignKey("CompanyId")]
public virtual Company Company { get; set; }
}
如果我创建一个新公司并将一个新的监控添加到监控列表中,我可以轻而易举地保存它。保存新公司后,我可以将已添加的监控设置为 ActiveMonitoring 并再次保存公司。
但是,如果我尝试添加监控并将其设置为 ActiveMonitioring 并仅保存公司一次,我会收到以下错误:
无法确定相关操作的有效顺序。 由于外键约束,模型可能存在依赖关系 需求或存储生成的值。
以下是用于创建新公司的示例 JavaScript 代码:
var company = unitofwork.companyRepository.create();
var monitoring = unitofwork.monitoringRepository.create();
//add monitoring to the list of monitorings
monitoring.company(company);
company.monitorings.push(monitoring);
//set monitoring as active monitoring
company.activeMonitoring(monitoring);
unitofwork.commit();
我使用 EntityFramework 6 和 Breeze 1.5.4
我尝试使用注释“InverseProperty”使关系更加明确,但没有成功。我还发现了一些相关的 stackoverflow 问题,但我找不到针对我的具体问题的解决方案:
Unable to determine a valid ordering for dependent operations
How to specify two navigation properties from entity X to the same target entity, Y?
我的课程允许以下情况:监控可以是一个公司列表的一部分,并设置为另一家公司的活动监控。但是,我不想允许这种情况:只有当它也是同一公司的监控列表的一部分时,才应允许监控成为活动监控。这是我问题的根本原因吗?
监控是否需要两次提及公司,例如CompanyForListReference 和 CompanyForActiveReference?或者是否有仅适用于一个 CompanyId 的解决方案?
我还考虑过不将实例保存为活动监控,而只保存监控列表中活动监控的索引,例如“IndexOfActiveMonitoring”。但是,如果我想访问活动的监控,我需要一些额外的代码来查找活动的监控。
=> 实施从公司到监控的两个引用的推荐方法是什么?
【问题讨论】:
标签: c# entity-framework ef-code-first