C# 如何获取纯关系记录的相关表和键值?

C# 如何获取纯关系记录的相关表和键值?,c#,entity-framework-5,C#,Entity Framework 5,我有两个表,Product和Category,它们有一个纯多对多交叉表,ProductCategory(即ProductCategory只包含两个字段,ProductID和CategoryID)。EF为我很好地模拟了这一点,因此产品具有类别属性,类别具有产品属性 现在,我想创建一个审计跟踪,无论何时插入、更新或删除记录,都会进行跟踪。通过创建分部类的另一半MyEntities并重写SaveChanges(),我成功地实现了这一点。因此: public override int SaveChang

我有两个表,
Product
Category
,它们有一个纯多对多交叉表,
ProductCategory
(即
ProductCategory
只包含两个字段,
ProductID
CategoryID
)。EF为我很好地模拟了这一点,因此
产品
具有
类别
属性,
类别
具有
产品
属性

现在,我想创建一个审计跟踪,无论何时插入、更新或删除记录,都会进行跟踪。通过创建分部类的另一半
MyEntities
并重写
SaveChanges()
,我成功地实现了这一点。因此:

public override int SaveChanges(SaveOptions options)
{
    var inserts = ObjectStateManager.GetObjectStateEntries(EntityState.Added).ToList();
    var updates = ObjectStateManager.GetObjectStateEntries(EntityState.Modified).ToList();
    var deletes = ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).ToList();
    ...
}
对于每个
插入
中的每个
ObjectStateEntry
更新
删除
,我可以通过
实体
属性获取正在修改的实体

这对于像
Product
Category
这样的常规表非常有效,但是它与
ProductCategory
一起爆炸,因为
实体
属性为空。我在运行时通过插入/删除的
ProductCategory
ObjectStateEntry
的公共界面到处搜寻,但找不到任何有助于我识别关键字段及其值的内容。我想得到:

  • 相关表格的名称(“产品”和“类别”)
  • 相关记录的键值(
    ProductID
    CategoryID
    的值)
  • 从每个表到交叉点的各个关系的名称(“类别”和“产品”)

我该怎么做?

如果我做对了-你应该试试我们在这里做的(在OP的帮助下)。
我想这很接近

具体来说,我认为

ManyToManyReferences = navigationProperties.Where(np =>
            np.FromEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many &&
            np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many)
            .Select(np => Extensions.CreateLambdaExpression<TEntity>(np.Name))
            .ToList();  
ManyToManyReferences=navigationProperties.Where(np=>
np.FromEndMember.RelationshipMultiplicity==RelationshipMultiplicity.Many&&
np.ToEndMember.RelationshipMultiplicity==RelationshipMultiplicity.Many)
.Select(np=>Extensions.CreateLambdaExpression(np.Name))
.ToList();

您可能还想查看这篇文章(以及我在那里收集的其他帖子的链接),了解更多关于元数据的信息。或者搜索
IObjectContextAdapter
或此处提到的一些关键字