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

以下行將會導致e.EntityState等於EntityState.Modified:如何確定是否有關係屬性的實體有變化

myEmployee.Name = "John" 

然而,改變一個屬性,它是一個關係會留下E .EntityState = EntityState.Unchanged。例如:

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

如何判斷myEmployee是否有更改?我需要知道,因此我可以記錄對員工記錄所做的更改以進行審計。

回答

2

有一種方法可以獲得關係的狀態,但獲得一個實體的狀態並不那麼容易。

ObjectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState state) 回報IEnumerable<ObjectStateEntry>與兩個條目,實體和關係(有上ObjectStateEntry IsRelationship屬性,以便您可以確定的,如果它是關係或實體)。

我測試了與你的榜樣,當關系改變你做

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

,我發現通過調用GetObjectStateEntries爲每個可能的EntityState一個ObjectStateEntry加有態的方式:

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

現在,您可以查看狀態條目的當前值以查看它們是否匹配關係的末端(而不是很好)。但是,這有點複雜,我不確定在任何情況下是否能夠滿足您的需求。

0

我有,當我試圖在實體框架來驗證一個類似的問題: 研究一點點後,我找到了解決辦法: (見IM發佈整個驗證解決方案)

接口驗證:

Interface IValidatable 

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

End Interface 

在部分類處理SavingChanges事件:

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 

請注意,不是「C ontexto.Facturacion「是由Entity框架引擎生成的Entities類的一個實例。

相關問題