2017-09-27 83 views
2

我正在將實體框架6.1.3遷移到使用C#和.NET Framework 4.7的實體框架核心代碼。與實體框架核心2.0的一對一關係

我一直在用Google搜索實體框架核心,但是我還沒有找到關於它的許多信息,所以我試圖自己做。

在實體框架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方法,而且我覺得其他方法WithOptionalWithManyWillCascadeOnDelete

我已經遷移到這一點,但我不知道這是否是正確的:

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的爲空,將其設置爲可選的,但我不能設置Code.CodeId爲空。

回答

4

EF6安裝程序正在創建所謂的One-To-One Shared Primary Key Association,其中依賴實體的PK也是FK到主體實體。

EF Core發生了變化。它自然支持共享PK和FK一對一關聯。也可選/不需要用於確定關聯的主體和從屬端。 IsRequired用於控制依賴實體是否可以不存在主體並僅適用於單獨的FK。儘管HasForeignKeyHasPrincipalKey用於確定關聯的主體和從屬端,並映射相關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)是EFP等效的EF6 WillCascadeOnDelete(false)。其他選項如ClientSetNullSetNull僅適用於依賴項具有單獨的可選FK時,這與共享PK關聯不同。

參考:Relationships

+0

感謝您的回答。有一些我不明白的地方:你在哪裏告訴從Code到AggregationChildren的關係是可選的? – VansFannel

+1

在這種情況下不需要。只有具有獨立FK的獨立實體可能具有可選或必需的實體。請參閱「IsRequired'方法的描述 - *」配置這是否是必需的關係(即外鍵屬性是否可以爲null)。「*。 EF6使用可選/必需的條款用於不同的目的。在EFC中,默認情況下關係是可選的,除非您有明確的單獨的不可空的FK屬性。 –