【问题标题】:EF4 Audit changes of many to many relationshipsEF4 审核多对多关系的更改
【发布时间】:2011-04-30 03:10:55
【问题描述】:

我正在将审核添加到我的 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);
    }
}

我如何才能获得关系更改所涉及的详细信息(甚至是实际实体)?

更新

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

【问题讨论】:

  • 你有想过这个吗?
  • 不,但我记得@Icrepas 的选项看起来很有希望,我只是没有时间去尝试。

标签: c# .net-4.0 entity-framework-4


【解决方案1】:

这可能会对您有所帮助:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这不是内部密封类,还是我找错了命名空间?
    • @ilivewithian 你可以使用dbContext.ChangeTracker.Entities() 方法访问CurrentValues,然后对于每个更改的实体,都会有一个名为CurrentValues 的属性。
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多