2010-05-20 74 views
3

我在Entity Framework 4.0模型的每個實體中添加了一個'IsDeleted'列併爲其實現了一個接口。我如何才能完成將'IsDeleted'設置爲'true'的實體被我的模型中的所有Objectset和Navigationproperties忽略?使用LinQ過濾結果不起作用,因爲結果不能轉換回ObjectSet。忽略EF 4.0中導航屬性中標記爲已刪除的記錄

有人可以幫我嗎?

BTW:我的模板生成上下文類ObjectSets像這樣:像這樣一個實體

Private _Persons As ObjectSet(Of Person) 
Public ReadOnly Property Persons() As ObjectSet(Of Person) 
    Get 
     If (_Persons Is Nothing) Then 
      _Persons = MyBase.CreateObjectSet(Of Person)("Persons") 
     End If 
     Return _Persons 
    End Get 
End Property 

和導航性能:

<XmlIgnoreAttribute()> 
<SoapIgnoreAttribute()> 
<DataMemberAttribute()> 
<EdmRelationshipNavigationPropertyAttribute("Model", "Map_Persons_Organisations", "Persons")> 
Public Property Persons() As EntityCollection(Of Person) 
    Get 
     Return CType(Me,IEntityWithRelationships).RelationshipManager.GetRelatedCollection(Of Person)("Model.Map_Persons_Organisations", "Persons") 
    End Get 
    Set 
     If (Not value Is Nothing) 
      CType(Me, IEntityWithRelationships).RelationshipManager.InitializeRelatedCollection(Of Person)("Model.Map_Persons_Organisations", "Persons", value) 
     End If 
    End Set 
End Property 

回答

-1

你是什麼請將isDeleted標誌的目的?標記爲刪除的對象的狀態由ObjectStateManager更新。通過查詢ObjectStateManager調用SaveChanges()之前,您可以確定某個對象是否已被標記爲刪除對象。

如果要從查詢中排除已刪除的實體,請致電SaveChanges()將其標記爲刪除。您還可以使用AcceptChanges()從集合中刪除實體,而不必將刪除提交到數據庫。

+0

目的是我不想丟失已刪除的數據。它不應該(永遠)在GUI上可見。我不認爲我可以用AcceptChanges()來做到這一點。將'WHERE IsDeleted = false'添加到每個查詢中也不是一種選擇,因爲它偶爾會被遺忘。 – FabianAlbrecht 2010-05-20 16:24:03

+1

聽起來好像你正試圖實施一個「存檔」標誌,表明一個實體已被「停用」並且不應該被訪問。這是EF範圍之外的特定於應用程序的要求。如果您不希望過濾像這樣的標誌上的所有查詢,則應考慮將存檔方法*複製*「取消激活」的實體到存檔表。 – 2010-05-20 16:28:10

+2

對這個問題的反應很差。我意識到這是一個古老的問題,但它仍然是一個常見的問題,你的回答基本上說,「我不在乎你在做什麼 - 你做錯了」,你對這種情況太無知了,索賠。如果系統的設計是應用程序不應該意識到軟刪除的記錄,並且這個歸檔過程是由數據庫/數據團隊完成的呢?然後它導致這實際上是一個特定於數據庫的問題,他們試圖使他們的DAL兼容。 – Jaxidian 2011-03-20 17:36:06