0

我有两个表ProductCategory,它们有一个纯粹的多对多交集表,ProductCategory(即ProductCategory只包含两个字段,ProductIDCategoryID)。EF 为我很好地建模了这个模型,它Product有一个Categories属性并且Category有一个Products属性。

现在我想创建一个审计跟踪,在插入、更新或删除记录时捕获。我通过创建部分类的另一半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每个inserts,我都可以通过属性 获取正在修改的实体。updatesdeletesEntity

这对于像Productand这样的常规表非常有效,但它会因为属性为空Category而被 轰炸掉。我在运行时通过insert/deleted的公共接口进行了挖掘,但找不到任何可以帮助我识别关键字段及其值的东西。我想得到:ProductCategoryEntityObjectStateEntryProductCategory

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

我该怎么做?

4

1 回答 1

0

如果我做对了 - 你应该尝试我们在这里所做的(在 OP 的帮助下)。
我认为这非常接近......

如何以编程方式读取 EF DbContext 元数据?

具体来说,我认为...

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


您可能还想查看这个(以及我在那里收集的其他帖子的链接)以获取有关元数据的更多信息。或者搜索IObjectContextAdapter或者这里提到的一些关键词

在运行时获取实体方面和其他元数据

于 2013-05-28T14:07:13.713 回答