EF4审核许多关系的变化 [英] EF4 Audit changes of many to many relationships

查看:138
本文介绍了EF4审核许多关系的变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将EFS(Model First)应用程序中添加审核。我可以获得有关具有更改的实体的结构属性的详细信息。我也可以看到,当时有很多关系发生变化。我可以看到涉及的类型的名称和发生了什么(添加或删除),但我真正希望的是参与关系变更的实体的Id。

I am in the process of adding auditing into my EF4 (model first) application. I can get the details about the structural properties on entities that have changes. I can also see when there have been changes on a many to many relationship. I can see the name of the types involved and what happened (add or remove) but what I'd really like is the Id's of the entities that are involved in the relationship change.

以下是我目前用于跟踪许多关系变化的内容:

Here is what I currently have for tracking changes to many to many relationships:

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);
    }
}

如何获取详细信息(甚至是实际的实体)参与关系变化?

How can I get the details (or even the actual entities) involved in the relationship change?

更新

再过几个小时,我设法找到我需要的信息(见附图)。但是,存储数据的类是内部密封类,我找不到公用条目来查询对​​象状态管理器以获取此信息。所以我可以审核变更。

After poking around on for a few more hours I have managed to find the information I need (see attached image). However, the classes that store the data are internal sealed classes and I can't find a public entry to query the object state manager to get this information out back. So I can audit the change.

推荐答案

这可能有助于您:

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...
          }
      }
 }

这篇关于EF4审核许多关系的变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆