2010-05-20 7 views
3

J'ai ajouté une colonne 'IsDeleted' à chaque entité dans mon modèle Entity Framework 4.0 et j'ai implémenté une interface pour cela. Comment puis-je accomplir que les entités avec 'IsDeleted' à 'true' sont ignorées par tous les objets Objectsets et Navigationproperties dans mon modèle? Filtrer le résultat en utilisant LinQ ne fonctionne pas je pense, parce que le résultat ne peut pas être transformé en un ObjectSet.Ignorer les enregistrements marqués comme supprimés dans les propriétés de navigation dans EF 4.0

Quelqu'un peut-il m'aider s'il vous plaît?

BTW: Mon modèle génère ObjectSets dans la classe de contexte comme celui-ci:

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 

et les propriétés de navigation pour les entités comme celui-ci:

<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 

Répondre

-1

Quel est le but de votre drapeau IsDeleted ? Les objets marqués pour suppression ont leur statut mis à jour par le ObjectStateManager. Vous pouvez déterminer si un objet a été marqué pour suppression avant d'avoir appelé SaveChanges() en interrogeant ObjectStateManager.

Si vous souhaitez exclure des entités supprimées de vos requêtes, appelez le SaveChanges() en les marquant pour la suppression. Vous pouvez également utiliser AcceptChanges() pour supprimer des entités de la collection sans valider la suppression de la base de données.

+0

Le but est que je ne veuille pas perdre les données supprimées. Il ne devrait pas (JAMAIS) être visible sur l'interface graphique. Je ne pense pas que je peux le faire avec AcceptChanges(). Ajouter 'WHERE IsDeleted = false' ou quelque chose à chaque requête n'est pas non plus une option, car elle serait oubliée de temps en temps. – FabianAlbrecht

+1

Il semble que vous essayez d'implémenter un drapeau "Archivé" qui indique qu'une Entité a été "désactivée" et ne devrait pas être accessible. C'est une exigence spécifique à l'application en dehors de la portée d'EF. Si vous ne voulez pas avoir à filtrer toutes vos requêtes sur un drapeau comme celui-là, vous devriez considérer une méthode Archive qui * copie * les entités "désactivées" dans une table d'archivage. –

+2

C'est une mauvaise réponse au problème. Je sais que c'est une vieille question, mais c'est toujours une question commune et votre réponse dit essentiellement: «Je me fiche de ce que vous faites - vous le faites mal» et vous êtes trop ignorant de la situation pour faire une telle une réclamation. Que se passe-t-il si la conception du système est que l'application ne doit pas prendre en compte les enregistrements supprimés de manière logicielle et que ce processus d'archivage est effectué par l'équipe de base de données/de données? Ensuite, cela nous amène à penser qu'il s'agit en fait d'une préoccupation propre à la base de données et qu'ils essaient de rendre leur DAL conforme. – Jaxidian

Questions connexes