我有两个表, Product
和 Category
,它们有一个纯粹的多对多交集表, ProductCategory
(即 ProductCategory
只包含两个字段, ProductID
和 CategoryID
) . 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();
...
}
并且对于 inserts
, updates
和 deletes
中的每个 ObjectStateEntry
,我可以通过 Entity
属性获取正在修改的实体 .
这对于像 Product
和 Category
这样的常规表很有用,但它会用 ProductCategory
炸弹,因为 Entity
属性为null . 我在运行时通过插入/删除的 ProductCategory
的 ObjectStateEntry
的公共接口进行了挖掘,但找不到任何可以帮助我识别关键字段及其值的内容 . 我想得到:
-
相关表的名称("Product"和"Category")
-
相关记录的关键值(
ProductID
和CategoryID
的值) -
从每个表到交叉点的相应关系的名称("Categories"和"Products") .
我该怎么做?
1 回答
如果我'm getting it right - you should try what we did in here (with the OP'的帮助) .
我认为这非常接近......
How I can read EF DbContext metadata programmatically?
具体来说,我认为......
您可能还想检查这个(以及我在那里收集的其他帖子的链接)以获取有关元数据的更多信息 . 或者搜索
IObjectContextAdapter
或此处提到的一些关键字Get entity facets and other metadata on runtime