2009-10-28 2 views
2
Dim myEmployee as Employee = myObjectContext.Employee.Where("it.EmployeeID = 1").First() 

La ligne suivante entraînera e.EntityState à égale EntityState.Modified:Comment déterminer si une entité avec des propriétés de relation a des changements

myEmployee.Name = "John" 

Toutefois, la modification d'une propriété qui est une relation laissera e .EntityState = EntityState.Unchanged. Par exemple:

myEmployee.Department = myObjectContext.Department.Where("it.DepartmentName = 'Accounting'").First() 

Comment puis-je savoir si myEmployee a des modifications? J'ai besoin de savoir pour pouvoir enregistrer les modifications apportées à l'enregistrement des employés à des fins d'audit.

Répondre

2

Il existe un moyen d'obtenir l'état d'une relation, mais il n'est pas aussi facile à obtenir que l'état d'une entité.

ObjectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState state) retours IEnumerable<ObjectStateEntry> avec des entrées pour les deux, les entités et les relations (il y a la propriété IsRelationship sur ObjectStateEntry afin que vous puissiez si elle est d'une durée déterminée relation ou entité).

Je l'ai testé avec votre exemple, lorsque la relation est changé la façon dont vous faites

myEmployee.Department = myObjectContext.Department.Where("it.DepartmentName = 'Accounting'").First() 

et je trouver en appelant GetObjectStateEntries pour chaque EntityState possible que l'un ObjectStateEntry est ajouté à l'état ajouté:

myObjectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added) 

Maintenant, vous pouvez jeter un œil aux valeurs actuelles de l'entrée d'état pour voir si elles correspondent aux extrémités de la relation (pas sympa). Cependant, c'est un peu compliqué et je ne suis pas sûr que cela puisse répondre à vos besoins dans tous les cas.

0

j'avais un problème similaire quand je suis en train de valider dans le cadre d'entité: Après avoir étudié un peu je l'ai trouvé une solution: (voir im affichage toute solution de validation)

Interface pour la validation:

Interface IValidatable 

Function Validate(Optional ByVal guardando As Boolean = False) As List(Of ApplicationException) 

End Interface 

Gestion de l'événement SavingChanges dans une classe partielle:

Partial Class FacturacionEntities 

Private Sub FacturacionEntities_SavingChanges(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SavingChanges 
    Dim objects As New List(Of System.Data.Objects.ObjectStateEntry) 
    objects.AddRange(Me.ObjectStateManager.GetObjectStateEntries(EntityState.Added)) 
    objects.AddRange(Me.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 

    Dim errors As New List(Of ApplicationException) 
    For Each obj In objects 
     If obj.IsRelationship Then 
      Dim fro = DirectCast(obj.CurrentValues(1), EntityKey) 
      Dim k As New EntityKey("FacturacionEntities." & fro.EntitySetName, fro.EntityKeyValues(0).Key, fro.EntityKeyValues(0).Value) 
      errors.AddRange(DirectCast(Contexto.Facturacion.GetObjectByKey(k), IValidatable).Validate()) 
     Else 
      errors.AddRange(DirectCast(obj.Entity, IValidatable).Validate) 
     End If 
    Next 
    If errors.Count > 0 Then 
     Dim err_list As String = "" 
     For Each s In errors 
      err_list = err_list & s.Message & vbCrLf 
     Next 
     Throw New ApplicationException(err_list) 
    End If 
End Sub 
    End Class 

S'il vous plaît noter que « C ontexto.Facturacion "est une instance de la classe Entities générée par le moteur de structure Entity.

Questions connexes