c# - 除了默认方法之外,如何在 Entity Framework 中定义外键关系

标签 c# entity-framework-6

我有一个问题想用 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; }
}

如您所见,在此示例中,PayPlanPolicy 的子对象。它可能为空,或者可能有一个与保单关联的 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/

相关文章:

c# - 在代码隐藏中将参数传递给 RelayCommand

c# - Entity Framework 6 - 代码优先 - FK 在继承类中生成,但关系在基类中定义

c# - 如何在 MVC4 中执行异步调用操作方法

c# - Entity Framework 更改主键类型

c# - 在每次创建上下文时发出 DbContext.OnModelCreating

c# - Lambda 按参数排序性能

c# - 结构体的内存限制

c# - 在 C# 应用程序中管理多个 Windows 窗体

C# LINQ 计算分组依据

c# - 如何从 Asp Net Core WebApi 将日志存储到 Azure 表存储?