EF4 Аудит изменений многих отношений - PullRequest
5 голосов
/ 13 января 2011

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

Вот то, что у меня есть в настоящее времядля отслеживания изменений отношения многих ко многим:

var changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified);
var auditTime = DateTime.Now;

foreach (var change in changes)
{
    if (change.Entity != null && change.Entity.GetType().Equals(typeof(AuditTrail)))
    {
        continue;
    }

    var detailsBuilder = new StringBuilder();

    if (change.Entity == null & (change.State == EntityState.Added | change.State == EntityState.Deleted))
    {
        detailsBuilder.Append("A link between entities ");
        foreach (var changedMember in change.EntitySet.ElementType.KeyMembers)
        {
            detailsBuilder.AppendFormat("{0}", changedMember.Name);
            if(change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) < change.EntitySet.ElementType.KeyMembers.Count -2)
            {
                detailsBuilder.Append(", ");
            }
            else if (change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember) == change.EntitySet.ElementType.KeyMembers.Count - 2)
            {
                detailsBuilder.Append(" and ");
            }
        }

        detailsBuilder.AppendFormat(" was {0}.<br />", change.State);
    }
}

Как я могу получить детали (или даже фактические сущности), связанные с изменением отношений?

ОБНОВЛЕНИЕ

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

alt text

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Это может помочь вам:

IEnumerable<IRelatedEnd> relatedEnds = ((IEntityWithRelationships) change.Entity).RelationshipManager.GetAllRelatedEnds();
foreach (var relatedEnd in relatedEnds)
{
     foreach (var subEntity in relatedEnd)
     {
          if (subEntity is IEntityWithRelationships)
          {
             var entityAssociated = (IEntityWithRelationships)subEntity;
             // Now you have your associated entity to work with...
          }
      }
 }
0 голосов
/ 27 января 2011

Вы можете получить доступ к двум объектам EntityKey через свойство CurrentValues ​​в RelationshipEntry (происходит от ObjectStateEntry).Должен дать вам то, что вам нужно.

...