簡體   English   中英

ef6 include()用於具有必需屬性的可空屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM