C# EF4审核多对多关系的变更

C# EF4审核多对多关系的变更,c#,.net-4.0,entity-framework-4,C#,.net 4.0,Entity Framework 4,我正在将审计添加到EF4(模型优先)应用程序中。我可以获得有关发生更改的实体的结构属性的详细信息。我还可以看到多对多关系何时发生了变化。我可以看到相关类型的名称和发生的情况(添加或删除),但我真正想要的是关系更改中涉及的实体的Id 以下是我目前用于跟踪多对多关系更改的内容: var changes = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityS

我正在将审计添加到EF4(模型优先)应用程序中。我可以获得有关发生更改的实体的结构属性的详细信息。我还可以看到多对多关系何时发生了变化。我可以看到相关类型的名称和发生的情况(添加或删除),但我真正想要的是关系更改中涉及的实体的Id

以下是我目前用于跟踪多对多关系更改的内容:

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);
    }
}
var changes=context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Deleted | EntityState.Modified);
var auditTime=DateTime.Now;
foreach(变化中的var变化)
{
if(change.Entity!=null&&change.Entity.GetType().Equals(typeof(AuditTrail)))
{
继续;
}
var detailsBuilder=新的StringBuilder();
if(change.Entity==null&(change.State==EntityState.Added | change.State==EntityState.Deleted))
{
Append(“实体之间的链接”);
foreach(change.EntitySet.ElementType.KeyMembers中的var changedMember)
{
AppendFormat(“{0}”,changedMember.Name);
if(change.EntitySet.ElementType.KeyMembers.IndexOf(changedMember)”,change.State);
}
}
我如何获得关系变更中涉及的细节(甚至是实际实体)

更新

在闲逛了几个小时后,我终于找到了我需要的信息(见附图)。但是,存储数据的类是内部密封的类,我找不到一个公共条目来查询对象状态管理器以获取这些信息。这样我就可以审核更改了


您可以通过RelationshipEntry(派生自ObjectStateEntry)的CurrentValues属性访问这两个EntityKey对象。应该能满足您的需要。

这可能会帮助您:

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...
          }
      }
 }
IEnumerable relatedEnds=((IEntityWithRelationships)change.Entity.RelationshipManager.GetAllRelatedEnds();
foreach(在relatedEnds中的var relatedEnd)
{
foreach(relatedEnd中的var子实体)
{
if(子实体为IEntityWithRelationships)
{
var entityAssociated=(IEntityWithRelationships)子实体;
//现在,您有了要处理的关联实体。。。
}
}
}

这不是一个内部密封类,还是我找错了名称空间?@ilivewithian您可以使用
dbContext.ChangeTracker.Entities()
方法访问
CurrentValues
,然后对于每个更改的实体,都会有一个名为
CurrentValues
的属性。您有没有发现这个问题?没有,但我记得@Icrepas的选择看起来很有希望,我只是没有时间去尝试。