我有一个问题想用 Entity Framework 6.0 来解决,希望这里有人能给出一些指导。我对 ADO.NET 更熟悉,但想在 EF 中完成这个项目。
我有一个名为 Policy 的对象,另一个名为 PayPlan
public class Policy
{
//Various properties not relevant
public PayPlan PaymentPlan { get; set; }
}
public class PayPlan
{
public int PayPlanId { get; set;}
public string Description { get; set; }
}
如您所见,在此示例中,PayPlan 是Policy 的子对象。它可能为空,或者可能有一个与保单关联的 PayPlan 实例。
当我运行模型构建器时,它会创建表并将外键插入到保单表中,用于支付计划中的记录。这对我来说并不适用,因为 1) 我想保持 Db 模式类似于以前版本的应用程序,其中 PolicyId 是 PayPlan 中的 ForeignKey 和 2) 使用级联删除,如果要删除 PayPlan会采取政策,我需要这是相反的方式。 Policy 是 Db 中所有其他对象绘制它们的关系的根对象形式。顺便说一下,PayPlan 只是这个讨论的一个例子,但在实际项目中,Policy 对象将包含许多以类似方式关联的子对象。
我的问题是,如何通过数据注释或 Fluent API 进行设置以实现我描述的架构?
最佳答案
如果我正确理解了您的要求,您希望构建这样的模型:
public class Policy {
[Key]
public int PolicyId { get; set; }
// this attribute is not required, but I prefer to be specific
// this attribute means navigation property PaymentPlan
// is "anoter end" of navigation property PayPlan.Policy
[InverseProperty("Policy")]
public virtual PayPlan PaymentPlan { get; set; }
}
public class PayPlan {
[Key]
public int PayPlanId { get; set; }
// define foreign key explicitly here
[ForeignKey("Policy")]
public int PolicyId { get; set; }
public virtual Policy Policy { get; set; }
public string Description { get; set; }
}
更新:以上内容在 EF Core 中有效,但在 EF 6 中无效。EF 6 将此视为一对多关系(并且在这一点上是正确的,因为一个策略可以有多个支付计划)。要创建一对(零或)一对关系,您可以像这样创建模型:
public class Policy
{
[Key]
public int PolicyId { get; set; }
[InverseProperty("Policy")]
public virtual PayPlan PaymentPlan { get; set; }
}
public class PayPlan
{
[Key, ForeignKey("Policy")]
public int PolicyId { get; set; }
public Policy Policy { get; set; }
public string Description { get; set; }
}
所以 PayPlan 没有自己的 Id,而是有 PolicyId,它既是 PK 又是 FK。这样,一份保单可能只存在一个(或没有)支付计划。
关于c# - 除了默认方法之外,如何在 Entity Framework 中定义外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47748243/