我正在將實體框架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
方法,而且我覺得其他方法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的爲空,將其設置爲可選的,但我不能設置Code.CodeId
爲空。
感謝您的回答。有一些我不明白的地方:你在哪裏告訴從Code到AggregationChildren的關係是可選的? – VansFannel
在這種情況下不需要。只有具有獨立FK的獨立實體可能具有可選或必需的實體。請參閱「IsRequired'方法的描述 - *」配置這是否是必需的關係(即外鍵屬性是否可以爲null)。「*。 EF6使用可選/必需的條款用於不同的目的。在EFC中,默認情況下關係是可選的,除非您有明確的單獨的不可空的FK屬性。 –