首页 文章

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

提问于
浏览
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();
    ...
}

并且对于 insertsupdatesdeletes 中的每个 ObjectStateEntry ,我可以通过 Entity 属性获取正在修改的实体 .

这对于像 ProductCategory 这样的常规表很有用,但它会用 ProductCategory 炸弹,因为 Entity 属性为null . 我在运行时通过插入/删除的 ProductCategoryObjectStateEntry 的公共接口进行了挖掘,但找不到任何可以帮助我识别关键字段及其值的内容 . 我想得到:

  • 相关表的名称("Product"和"Category")

  • 相关记录的关键值( ProductIDCategoryID 的值)

  • 从每个表到交叉点的相应关系的名称("Categories"和"Products") .

我该怎么做?

1 回答

  • 0

    如果我'm getting it right - you should try what we did in here (with the OP'的帮助) .
    我认为这非常接近......

    How I can read EF DbContext metadata programmatically?

    具体来说,我认为......

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

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

    Get entity facets and other metadata on runtime

相关问题