首页 > 解决方案 > 实体框架核心 ForeignKeyAttribute 两边

问题描述

我有一个带有 Entity Framework Core 的应用程序,在我的上下文中具有不同的实体,但其中有两个需要一对零或一的关系。我这样做并确保验证的方法是执行以下操作:

public class PurchasedPackage
{
    public int Id { get; set; }

    ...

    [ForeignKey(nameof(PurchasedPackageModifier))]
    public int? PurchasedPackageModifierId { get; set; }

    public virtual PurchasedPackageModifier PurchasedPackageModifier { get; set; }
}

public class PurchasedPackageModifier
{
    public int Id { get; set; }

    ...

    [Required]
    [ForeignKey(nameof(PurchasedPackage))]
    public int PurchasedPackageId { get; set; }

    public virtual PurchasedPackage PurchasedPackage { get; set; }

    ...
}

哪里PurchasedPackage是必需的并且PurchasedPackageModifier是可选的。通过在双方指定ForeignKey属性,我试图确保保存到两个表的数据完整性,因此没有人创建一个PurchasedPackage不存在的PurchasedPackageModifier,反之亦然。

虽然这可以按要求工作,但我在日志中收到警告,说明如下:

'PurchasedPackage.PurchasedPackageModifier' and 'PurchasedPackageModifier.PurchasedPackage' were separated into two relationships as ForeignKeyAttribute was specified on properties 'PurchasedPackageModifierId' and 'PurchasedPackageId' on both sides.

'PurchasedPackageModifier.PurchasedPackage' and 'PurchasedPackage.PurchasedPackageModifier' were separated into two relationships as ForeignKeyAttribute was specified on properties 'PurchasedPackageId' and 'PurchasedPackageModifierId' on both sides.

我的问题是:我这样做是否正确,在这种特殊情况下我应该忽略这些警告还是有更好的方法来实现相同的验证/完整性行为?

标签: c#.netdatabaseentity-frameworkentity-framework-core

解决方案


这个关于警告的问题已于 2018 年 4 月关闭。我现在确实用 mysql(pomelo lib) 尝试了你的两个课程,确实我得到了一个 FK。因此,如果您可以接受,则可以忽略警告(引用该 github 链接中的一位开发人员)

如果您真的想要“一对零或一的关系”,那么我将采用以下方法:

  • PurchasedPackage没有 FK PurchasedPackageModifier,我的意思是同时删除int? PurchasedPackageModifierId和导航属性urchasedPackageModifier PurchasedPackageModifier- 这涵盖了 1-0 部分,其中记录PurchasedPackage可以存在而没有相应PurchasedPackageModifier的存在
  • PurchasedPackageModifier有一列PurchasedPackageId是 FK PurchasedPackage,也是一个唯一索引 - 这涵盖了 1-1 部分,其中

推荐阅读