Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 与实体框架核心2.0的一对零关系_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 与实体框架核心2.0的一对零关系

C# 与实体框架核心2.0的一对零关系,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我正在将EntityFramework6.1.3代码优先库迁移到带有C#和.NETFramework4.7的EntityFramework核心 我一直在谷歌搜索实体框架核心,但我没有找到很多关于它的信息,所以我试着自己做 在实体框架6.1.3中,我有以下配置类: using System.Data.Entity.ModelConfiguration; namespace MyProject.Data.SqlServer.Configurations { class Aggregatio

我正在将EntityFramework6.1.3代码优先库迁移到带有C#和.NETFramework4.7的EntityFramework核心

我一直在谷歌搜索实体框架核心,但我没有找到很多关于它的信息,所以我试着自己做

在实体框架6.1.3中,我有以下配置类:

using System.Data.Entity.ModelConfiguration;

namespace MyProject.Data.SqlServer.Configurations
{
    class AggregationChildrenConfiguration : EntityTypeConfiguration<AggregationChildren>
    {
        public AggregationChildrenConfiguration()
        {
            HasKey(ag_ch => ag_ch.AggregationChildrenId);

            HasRequired(ag_ch => ag_ch.Aggregation)
                .WithMany(ag => ag.AggregationChildren)
                .HasForeignKey(ag_ch => ag_ch.AggregationId);

            HasRequired(ag_ch => ag_ch.Code)
                .WithOptional(c => c.AggregationChild)
                .WillCascadeOnDelete(false);
        }
    }
}
我一直在检查文档,但我不知道我必须使用哪些方法,或者这是否是迁移到EntityFramework核心的正确方法

此关系不是一对零:

builder.HasOne(ag_ch => ag_ch.Code)
    .WithOne(c => c.AggregationChild)
    .OnDelete(DeleteBehavior.SetNull);

在这种情况下,我必须将ForeignKey设置为null,它会将其设置为可选,但我不能将
code.CodeId
设置为null。

EF6设置正在创建所谓的依赖实体的PK也是FK到主体实体

EF Core的情况发生了变化。它自然支持共享PK和FK一对一关联。另外,可选/必填项不用于确定关联的主体和从属端
IsRequired
用于控制从属实体是否可以存在而不存在主体,并且仅适用于单独的FK。而
HasForeignKey
HasPrincipalKey
用于确定关联的主体和从属端,并映射从属FK和主体PK/备用键

尽管如此,等效EFC配置如下所示:

builder.HasOne(ag_ch => ag_ch.Code)
    .WithOne(c => c.AggregationChild)
    .HasForeignKey<AggregationChildren>(ag_ch => ag_ch.AggregationChildrenId)
    .OnDelete(DeleteBehavior.Restrict);
builder.HasOne(ag\u ch=>ag\u ch.code)
.WithOne(c=>c.AggregationChild)

.HasForeignKey

谢谢你的回答。有一点我还不明白:你在说什么,从代码到AggregationChildren的关系是可选的?在这种情况下没有必要。只有具有单独FK的从属实体才可以具有可选或必需属性。请参阅
IsRequired
方法-“配置这是否是必需的关系(即外键属性是否可以分配为空)。”。EF6为不同目的使用可选/必需术语。在EFC中,默认情况下关系是可选的,除非您有显式的单独的不可为null的FK属性。我试图在父级和子级上定义HasForeignKey,但它总是在父级上结束。我尝试过将子对象指定为泛型类型,将父对象指定为泛型类型,但它始终以父对象结束。@ChaimEliyah不可能。显然你做错了什么。首先,必须只有一个关系定义(以确保您没有创建冲突的关系配置)。其次,必须为子(依赖)实体定义FK。就这样。父级(主体)从未被视为FK。
builder.HasOne(ag_ch => ag_ch.Code)
    .WithOne(c => c.AggregationChild)
    .OnDelete(DeleteBehavior.SetNull);
builder.HasOne(ag_ch => ag_ch.Code)
    .WithOne(c => c.AggregationChild)
    .HasForeignKey<AggregationChildren>(ag_ch => ag_ch.AggregationChildrenId)
    .OnDelete(DeleteBehavior.Restrict);