2016-06-07 66 views
1

我在我的項目中使用EF7 rc2。 有兩個相關的類EF7將子對象設置爲null問題

public sealed class Member 
{ 
    ...... 
    public MemberState State { get; set; } 
} 

public sealed class MemberState 
{ 
    public Guid Id { get; set; } 
    public Org Org { get; set; } 
    .... 
} 

和EF配置:

modelBuilder.Entity<MemberState>(entity => 
{ 
    entity.ToTable("State"); 
    entity.HasKey(e => e.Id);  
    entity.Property<Guid>("Idf_Org"); 
    entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org");  
    .....  
}); 

modelBuilder.Entity<Member>(entity => 
{ 
    entity.HasKey(e => e.Id); 
    entity.Property<Guid>("Idf_State"); 
    entity.HasOne(member => member.State).WithMany().HasForeignKey("Idf_State"); 
}); 

因此,在一段時間內我whant設置爲null,組織場MembersState。

mwmbwe.State = new MemberState() 
{ 
    Id = Guid.NewGuid(), 
    .... 
    Org = null 
};   
_provider.SaveChanges(); 

將更改保存到數據庫時發生異常。 EF試圖插入相關組織項目與空PK。 有什麼辦法可以把它弄明白嗎?

也tryed解決直接ExecuteSqlCommand這個問題,而且不是從EF提供商獲取新MemberState,但它引發的異常過:「對象引用不設置到對象的實例」

在數據庫領域,包含Idf_Org標記爲「允許空值」

回答

0

魔鬼詳細)

Mortezas答案是非常有益的,但應用它後,我有過這樣的exeption: 「System.InvalidOperationException」類型的異常出現在Microsoft.EntityFrameworkCore.dll但沒有在用戶代碼中處理其他信息:實體類型'MemberState'上的外鍵{'Idf_Org'}不能標記爲可選,因爲它不包含任何可爲空類型的屬性。任何外鍵都可以標記爲必需的,但只有至少具有一個可爲空類型的屬性且不屬於主鍵的外鍵纔可以標記爲可選項。

所以,真正的決定是

entity.Property<Guid?>("Idf_Org"); 
entity.HasOne(e => e.Org).WithMany().HasForeignKey("Idf_Org").IsRequired(false); 

它只能聞陰影屬性標記爲空的太

+0

這是正確的,其他(更好)的方法是有您的* MemberState *對象上的可空FK屬性映射到* Idf_Org *,而不是將其映射。 –

0

如果聯想MemberState和組織之間是可選的,那麼你需要你的流利的API中指定此:

entity.HasOne(e => e.Org) 
     .WithMany() 
     .HasForeignKey("Idf_Org") 
     .IsRequired(false); 

因此,EF Core將允許您在運行時保存沒有Org的MemberState。

+0

其實,我曾經嘗試這樣做,並且它似乎真正的決定,但重新配置我的ASP後.NET核心1.0應用程序無法啓動。這很奇怪 - 沒有例外,或輸出警告被觸發 –

+0

UPD 輸出包含此: 異常拋出:Microsoft.EntityFrameworkCore.dll中的'System.InvalidOperationException' –

相關問題