c# - 实体框架核心 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.
我的问题是:我这样做是否正确,在这种特殊情况下我应该忽略这些警告还是有更好的方法来实现相同的验证/完整性行为?
解决方案
这个关于警告的问题已于 2018 年 4 月关闭。我现在确实用 mysql(pomelo lib) 尝试了你的两个课程,确实我得到了一个 FK。因此,如果您可以接受,则可以忽略警告(引用该 github 链接中的一位开发人员)
如果您真的想要“一对零或一的关系”,那么我将采用以下方法:
PurchasedPackage
没有 FKPurchasedPackageModifier
,我的意思是同时删除int? PurchasedPackageModifierId
和导航属性urchasedPackageModifier PurchasedPackageModifier
- 这涵盖了 1-0 部分,其中记录PurchasedPackage
可以存在而没有相应PurchasedPackageModifier
的存在PurchasedPackageModifier
有一列PurchasedPackageId
是 FKPurchasedPackage
,也是一个唯一索引 - 这涵盖了 1-1 部分,其中
推荐阅读
- c# - 未调用 SaveStateToBundle
- c# - 有没有办法在没有卸载注册表或 C:\Windows\Installer 的情况下检测安装位置?
- google-apps-script - 使用 Google 脚本检查 Google 驱动器文件夹中的特定文件
- angular - 有没有人想办法让 Protractor 中的 ChromeDriver 始终使用稳定版本?
- python - 在 Python Tkinter 中使用函数时添加图像
- python-3.x - Django Rest Framework:为什么PrimaryKeyRelatedField在read_only时在模式中以字符串形式记录?
- ruby - 在 Ruby 中使用字符串插值时,在 while 循环中递增 1
- javascript - JavaScript 的“未定义”变量变成数字的行为真的很奇怪吗?
- python - 无法更改 Pandas DataFrame 列中的值
- python - 如何将文件中的json对象添加到另一个文件中的另一个json对象数组中