我正在使用C#和.NET Framework 4.7将Entity Framework 6.1.3 Code First库迁移到Entity Framework Core。
我一直在搜索有关Google的Entity Framework Core,但我还没有找到很多有关它的信息,所以我自己试着这样做。
On Entity Framework 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);
}
}
}
我已迁移到这个:
using DataLibrary;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace BusinessLibrary.Configurations
{
class AggregationChildrenConfiguration : IEntityTypeConfiguration<AggregationChildren>
{
public void Configure(EntityTypeBuilder<AggregationChildren> builder)
{
builder.HasKey(ag_ch => ag_ch.AggregationChildrenId);
builder.HasRequired(ag_ch => ag_ch.Aggregation)
.WithMany(ag => ag.AggregationChildren)
.HasForeignKey(ag_ch => ag_ch.AggregationId);
builder.HasRequired(ag_ch => ag_ch.Code)
.WithOptional(c => c.AggregationChild)
.WillCascadeOnDelete(false);
}
}
}
但是构建器没有HasRequired
方法,我认为其他方法WithOptional
,WithMany
和WillCascadeOnDelete
。
我已迁移到此,但我不确定它是否正确:
using DataLibrary;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace BusinessLibrary.Configurations
{
class AggregationChildrenConfiguration : IEntityTypeConfiguration<AggregationChildren>
{
public void Configure(EntityTypeBuilder<AggregationChildren> builder)
{
builder.HasKey(ag_ch => ag_ch.AggregationChildrenId);
builder.HasOne(ag_ch => ag_ch.Aggregation)
.WithMany(ag => ag.AggregationChildren)
.HasForeignKey(ag_ch => ag_ch.AggregationId)
.IsRequired();
builder.HasOne(ag_ch => ag_ch.Code)
.WithOne(c => c.AggregationChild)
.OnDelete(DeleteBehavior.SetNull);
}
我一直在查看EntityTypeBuilder文档,但我不知道我必须使用哪些方法,或者这是迁移到Entity Framework Core的正确方法。
这种关系不是一对一的:
builder.HasOne(ag_ch => ag_ch.Code)
.WithOne(c => c.AggregationChild)
.OnDelete(DeleteBehavior.SetNull);
在此SO Answer中说我必须将ForeignKey设置为null,它会将其设置为可选,但我不能将Code.CodeId
设置为可为空。
答案 0 :(得分:13)
EF6设置正在创建一个所谓的One-To-One Shared Primary Key Association,其中从属实体的PK也是主体实体的FK。
EF Core中的情况发生了变化。它自然支持共享PK和FK一对一关联。还可以使用optional / required来确定关联的主要和从属端。 IsRequired
用于控制依赖实体是否可以存在w / o principal并且仅应用单独的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);
因此,我们首先使用HasOne
+ WithOne
定义关系。
然后HasForeignKey<AggregationChildren>(ag_ch => ag_ch.AggregationChildrenId)
告诉EF(1)AggregationChildren
是关系的依赖端,(2)PK AggregationChildrenId
也应该用作FK。
最后,OnDelete(DeleteBehavior.Restrict)
是EFC与EF6 WillCascadeOnDelete(false)
的等价物。其他选项如ClientSetNull
和SetNull
仅在依赖项具有单独的可选FK时适用,而不是共享PK关联的情况。