[英]ef6 include() for nullable properties with required attribute
我們剛剛更新到EF6,與以前的版本相比,存在一個行為異常的問題。
如果屬性可為空,則EF用於為Include語句生成LEFT JOIN。 但是,此版本看起來也考慮了[required]屬性。
例如,我有以下課程:
public class Client
{
[DisplayName("Industry Code")]
[Required]
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}
當我們做
return db.Clients
.Include(o => o.CountryISOEntity)
....
.Include(o => o.IndustryEntity)
.Single(o => o.Id == clientId);
以前的版本生成了LEFT OUTER JOIN,而新版本生成了INNER JOIN。
如果刪除[required]屬性,它將生成LEFT JOIN。 但這不是我的選擇,因為我們使用此屬性向用戶顯示錯誤,但是用戶可以選擇保存不完整的實體,然后再返回。 當用戶返回時,會收到一條錯誤消息,指出該記錄不存在,因為include會生成INNER JOIN。
新EF6中是否有設置可禁用此行為(忽略屬性)並基於可為空的信息生成sql查詢? 還是可以在包含中強制使用LEFT JOIN? 還是我們唯一的回滾到以前的EF版本的選擇?
PS:我們正在使用.Net 4.0
謝謝
我假設您要在MVC中使用Required
屬性進行表單驗證,而不是告訴Entity Framework該屬性是必需的。 這就是為什么需要視圖模型的原因,因此可以將視圖的驗證邏輯與Entity Framework驗證邏輯分開。
您的視圖模型代表一個視圖,並包含呈現該視圖所需的所有數據。 域模型(實體)表示數據庫中的一個(或多個)表。 視圖模型不一定包含與域模型相同的屬性。 以我的個人經驗,它們通常是不同領域模型的組合。
如果為Client
創建視圖模型,則可以從EF POCO中刪除驗證屬性。
視圖模型將如下所示:
public class ClientModel
{
[DisplayName("Industry Code")]
[Required]
public int IndustryId { get; set; }
// Other properties..
}
然后,您的POCO可能如下所示:
public class Client
{
public int? IndustryId { get; set; }
[ForeignKey("IndustryId")]
public Industry IndustryEntity { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.