2014-12-03 71 views
0

在實體設計器中,我在實體上設置條件映射,在該實體上它通過'isactive'字段過濾所有客戶。在linq中更改實體條件

這很好,沒有問題,但問題出現在我的LINQ。

當我需要將客戶設置爲'IsActive = false'時會發生什麼情況。該屬性沒有映射到我的實體,因爲條件已映射,但在Linq中,我無法找到改變它的方法。

using (var db = new CustDbConn()) 
{ 

    Customer customer= db.Customers.Single(p => p.Id == idFromEmail); 
    customer.IsActive = false; //<----NOT FOUND, can not resolve 'isActive' 

} 

必須有一種方法來訪問和更改LINQ中的條件,有人可以對此有所瞭解嗎?我想過繞過模型,只是使用SqlCommand來更新它,但我不應該經歷所有這些。

回答

1

使用LINQ查詢無法更改模型(您正在嘗試執行的操作)。

操縱IsActive屬性的唯一方法是將其帶入Customer模型,並丟棄條件映射。

UPD

您誤解了條件映射的主要用途 - inheritance
請注意,使用EF您不能使用數據庫表,您使用實體類型。你擁有的只是一個模型。如果模型中缺少任何表格字段,那麼您無法通過模型訪問它。關於你的問題,是的,你不能改變患者的活動狀態,因爲有在模型中沒有活動狀態

是的,如果您打算使用某種刪除/活動標記(例如您樣本中的IsActive),則必須將其包含在您的查詢中,否則您將在結果中獲得不活動/已刪除的項目。當然,你可以做幫手/庫/包裝/等將其自動化:

interface IEntity 
{ 
    int Id { get; } 
    bool IsActive { get; set; } 
} 

interface IRepository<T> 
    where T : IEntity 
{ 
    IQueryable<T> Get(bool includeInactiveEntities = false); 
} 
+0

以防萬一來驗證我沒有讓自己清楚,你說我不能改變的活動的患者之一如果我使用條件映射,表中的狀態永遠不會變化?如果在設計數據庫或添加新條目時必須始終設置條件,那麼這樣做是否違背了條件的目的?如果我將它帶回來,那麼我必須在涉及客戶的所有查詢中添加「where isactive = true」。 – prospector 2014-12-03 07:04:57

+0

更新了答案。 – Dennis 2014-12-03 07:15:04

+0

感謝您的解釋,我瞭解條件映射的主要目的。我想保持它,所以我沒有把它列入每個查詢,我認爲最好的辦法是直接使用的SqlCommand更新在這種情況下更改數據庫中的值並繞過模式。 – prospector 2014-12-03 07:24:38