Как определить, есть ли у сущности со свойствами отношения изменения - PullRequest
2 голосов
/ 29 октября 2009
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 ]

2 голосов
/ 29 октября 2009

Существует способ получить состояние отношений, но его не так легко получить, как состояние объекта.

ObjectContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState state) возвращает IEnumerable<ObjectStateEntry> с записями как для сущностей, так и для отношений (в ObjectStateEntry есть свойство IsRelationship, чтобы вы могли определить, является ли это взаимосвязью или сущностью).

Я проверил на твоем примере, как изменились отношения так же, как ты

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

и я узнаю, вызывая GetObjectStateEntries для каждого возможного EntityState, что один ObjectStateEntry добавляется с состоянием Added:

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

Теперь вы можете посмотреть текущие значения записи состояния, чтобы увидеть, соответствуют ли они концам отношений (не очень). Тем не менее, это немного сложно, и я не уверен, будет ли это соответствовать вашим потребностям в каждом случае.

0 голосов
/ 24 февраля 2010

У меня была похожая проблема, когда я пытался проверить в Entity Framework: После небольшого исследования я нашел решение: (см. публикацию полного решения по валидации)

Интерфейс для проверки:

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

Обратите внимание, что "Contexto.Facturacion" является экземпляром класса Entities, созданным механизмом платформы Entity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...