地图"插入;表与EF
本文关键字:表与 EF 插入 地图 quot | 更新日期: 2023-09-27 17:54:32
我想保存对Comment
实体/表所做的所有更改的历史记录。
我的方法:-使用"insert only"表
-使用复合PK,由数据库生成的int键和数据库生成的DateTime戳组成
-在实体上使用AsNoTracking
但是,假设它是这个实体的导航属性:
public Article {
public int ID { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public virtual Comment Comments { get; set; }
}
因此,如果我调用articleFoo.Comments
,它将获得所有实体,这意味着所有修订。我只想买"最新的"。我该如何做到这一点?——更新
- 如果我使用Linq过滤,那么我该怎么做呢,或者
如果我使用过程选项,那么我该怎么做呢? - 我的假设是不完整的——我必须生成复合键,因为对于两个修订实体,它们的ID必须相等,但它们更新的日期时间必须不同。所以我不能让数据库自动生成这些,可以吗?
您可以通过为Comments
创建影子表或审计表来执行仅Db路由。这将使用表触发器在字段级别跟踪所有的插入、修改和删除。我四处寻找一个工具来让它变得更容易,我在CodeProject上找到了一个-但是如果你搜索更长时间,你可以找到更好的东西。
如果这不能让你浮起你的船,那么…
通过EF,您可以在提交之前检查新的,更新的或删除的注释记录,并在提交之前添加历史信息。
例如,使用ObjectContext.SavingChanges
,您可以检查和记录更改,然后将您自己的历史记录添加到上下文中。
在我的例子中,我的DbContext
实例是StackOverflowEntities
,我在底层ObjectContext.SaveChanges
事件上添加了事件处理程序
// SavingChanges event handler.
private void context_SavingChanges(object sender, EventArgs e) {
ObjectContext objectContext = sender as ObjectContext;
if (objectContext != null) {
foreach (ObjectStateEntry entry in objectContext.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted)
.Where(et => et.Entity.GetType().Equals(typeof(Comment)))) {
Comment comment = entry.Entity as Comment;
Comment_Audit audit = new Comment_Audit {
BodyText = comment.BodyText,
Commentor = comment.Commentor,
..
..
ChangedAt = DateTime.Now,
ChangeType = entry.State.ToString()
};
StackOverflowEntities.Set<Comment_Audit>().Add(audit);
}
}
}
现在,每次更改Comment
时,您都要添加一条审计记录并与之一起保存