Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架双方的核心ForeignKeyAttribute_C#_.net_Database_Entity Framework_Entity Framework Core - Fatal编程技术网

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链接中的一个开发人员)

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

  • PurchasedPackage
    没有FK到
    PurchasedPackageModifier
    ,我的意思是同时删除
    int?PurchasedPackageModifier ID
    和导航属性
    urchasedPackageModifier PurchasedPackageModifier
    -这包括1-0部分,其中
    PurchasedPackage
    中的记录可以存在,而不存在相应的
    PurchasedPackageModifier
  • PurchasedPackageModifier
    有一个列
    PurchasedPackageId
    ,它是FK到
    PurchasedPackage
    的,并且还有一个唯一的索引-这包括1-1部分,其中

其中需要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的存在