C# 实体框架双方的核心ForeignKeyAttribute
我有一个实体框架核心的应用程序,在我的上下文中有不同的实体,但其中有两个需要一对零或一关系。我这样做并确保验证的方法是执行以下操作:C# 实体框架双方的核心ForeignKeyAttribute,c#,.net,database,entity-framework,entity-framework-core,C#,.net,Database,Entity Framework,Entity Framework Core,我有一个实体框架核心的应用程序,在我的上下文中有不同的实体,但其中有两个需要一对零或一关系。我这样做并确保验证的方法是执行以下操作: public class PurchasedPackage { public int Id { get; set; } ... [ForeignKey(nameof(PurchasedPackageModifier))] public int? PurchasedPackageModifierId { get; set; }
public class PurchasedPackage
{
public int Id { get; set; }
...
[ForeignKey(nameof(PurchasedPackageModifier))]
public int? PurchasedPackageModifierId { get; set; }
public virtual PurchasedPackageModifier PurchasedPackageModifier { get; set; }
}
'PurchasedPackage.PurchasedPackageModifier' and 'PurchasedPackageModifier.PurchasedPackage' were separated into two relationships as ForeignKeyAttribute was specified on properties 'PurchasedPackageModifierId' and 'PurchasedPackageId' on both sides.
及
其中,PurchasedPackage
是必需的,PurchasedPackageModifier
是可选的。通过在两侧指定ForeignKey
属性,我试图确保两个表的保存之间的数据完整性,这样就不会有人使用不存在的PurchasedPackageModifier
创建一个PurchasedPackage
,反之亦然
虽然这项工作符合要求,但我在日志中收到警告,说明如下:
public class PurchasedPackage
{
public int Id { get; set; }
...
[ForeignKey(nameof(PurchasedPackageModifier))]
public int? PurchasedPackageModifierId { get; set; }
public virtual PurchasedPackageModifier PurchasedPackageModifier { get; set; }
}
'PurchasedPackage.PurchasedPackageModifier' and 'PurchasedPackageModifier.PurchasedPackage' were separated into two relationships as ForeignKeyAttribute was specified on properties 'PurchasedPackageModifierId' and 'PurchasedPackageId' on both sides.
及
我的问题是:我做得对吗?在这种特殊情况下,我应该忽略这些警告,还是有更好的方法实现相同的验证/完整性行为?关于警告的讨论将于2018年4月结束。我现在用mysql(pomelo lib)尝试了你的两个类,实际上我得到了一个FK。因此,如果您可以接受,您可以忽略警告(引用github链接中的一个开发人员)
如果您真的想要“一对零或一关系”,那么我将采用以下方法:
没有FK到PurchasedPackage
,我的意思是同时删除PurchasedPackageModifier
和导航属性int?PurchasedPackageModifier ID
-这包括1-0部分,其中urchasedPackageModifier PurchasedPackageModifier
中的记录可以存在,而不存在相应的PurchasedPackage
PurchasedPackageModifier
有一个列PurchasedPackageModifier
,它是FK到PurchasedPackageId
的,并且还有一个唯一的索引-这包括1-1部分,其中PurchasedPackage
其中需要PurchasedPackage,而PurchasedPackageModifier是可选的。通过在两侧指定ForeignKey属性,我试图确保两个表的保存之间的数据完整性,这样就不会有人使用不存在的PurchasedPackageModifier创建PurchasedPackage,反之亦然。
这与我有点矛盾,因此如果您无法创建一个而没有另一个,则没有任何选项,还是我遗漏了什么?@cantSleepNow与MSSQL一起创建了两个FK,每个表一个。至于必填/可选问题-PurchasedPackage可以有零个或一个PurchasedPackageModifier,而没有PurchasedPackage则无法存在。可以在不使用修改器的情况下创建/更新PurchasedPackage,但如果提供了修改器,则应检查其完整性。PurchasedPackageModifier必须始终包含应用它的PurchasedPackage。感谢您的澄清,我将根据需要编辑答案我确实希望一对零或一,问题是,如果我跳过PurchasedPackage上的FK,则可以将PurchasedPackage实体保存为PurchasedPackage.PurchasedPackageModifier Id设置为与PurchasedPackageModifier表中的任何现有Id不对应的任何无效值,并在该注释后编辑答案。最初,删除FK意味着同时删除int属性和navigation属性。我是否正确地假设我的2个选项要么有2个FK,要么完全删除对PurchasedPackage上PurchasedPackageModifier的访问?我不知道这是否是唯一的2:),但在这种情况下,2个FK似乎有点奇怪。也许可以看看我的想法所涵盖的用例:1-您可以有一个没有PurchasedPackageModifier的PurchasedPacakge
,您可以查询这些条目。2-如果您有PurchasedPackageModifier
对应的PurchasedPacakge
条目ahs存在(感谢FK),并且它可以正好有一个条目ahs(感谢UniqueIDX),您还可以查询所有具有PPM的PPs。因此,您不需要删除访问权限,因为不需要以这种方式进行访问,如果你只做PP-JOIN-PPM,你会得到所有有PPM的PPs,如果你做PP-LEFT-JOIN-PPM,其中INSULL(PPM)(显然是伪代码)你会得到所有没有PPM的PPs。这就是你所需要的。所以,通过使用两个表而不是一个表来寻找PPM的存在