gpt4 book ai didi

c# - 使用 MVC 和 Entity Framework 实现审计日志/更改历史记录

转载 作者:IT王子 更新时间:2023-10-29 04:09:37 25 4
gpt4 key购买 nike

我正在为使用 Entity Framework 的 MVC 应用程序构建更改历史记录/审核日志。

所以具体在编辑方法public ActionResult Edit(ViewModel vm)中,我们找到我们要尝试更新的对象,然后使用TryUpdateModel(object)进行转置从表单到我们正在尝试更新的对象的值。

我想在该对象的任何字段更改时记录更改。所以基本上我需要的是对象在编辑之前的副本,然后在 TryUpdateModel(object) 完成其工作后比较它。即

[HttpPost]
public ActionResult Edit(ViewModel vm)
{
//Need to take the copy here
var object = EntityFramework.Object.Single(x=>x.ID = vm.ID);

if (ModelState.IsValid)
{
//Form the un edited view model
var uneditedVM = BuildViewModel(vm.ID); //this line seems to confuse the EntityFramework (BuildViewModel() is used to build the model when originally displaying the form)
//Compare with old view model
WriteChanges(uneditedVM, vm);
...
TryUpdateModel(object);
}
...
}

但问题是当代码检索到“未编辑的虚拟机”时,这会导致 EntityFramework 发生一些意外的变化 - 因此 TryUpdateModel(object); 会抛出一个 UpdateException.

所以问题是 - 在这种情况下 - 我如何在 EntityFramework 之外创建 object 的副本来比较更改/审计历史,以便它确实不影响或改变 Entity Framework

编辑:不想使用触发器。需要记录做这件事的用户名。

edit1:使用 EFv4,不太确定如何覆盖 SaveChanges() 但它可能是一个选项


这么简单的需求,这条路好像走不通!我终于让它正确覆盖了,但现在我得到了该代码的异常:

public partial class Entities
{
public override int SaveChanges(SaveOptions options)
{
DetectChanges();
var modifiedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
foreach (var entry in modifiedEntities)
{
var modifiedProps = ObjectStateManager.GetObjectStateEntry(entry).GetModifiedProperties(); //This line throws exception The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Data.Objects.EntityEntry'.
var currentValues = ObjectStateManager.GetObjectStateEntry(entry).CurrentValues;
foreach (var propName in modifiedProps)
{
var newValue = currentValues[propName];
//log changes
}
}

//return base.SaveChanges();
return base.SaveChanges(options);
}
}

最佳答案

如果您使用的是 EF 4,则可以订阅 SavingChanges 事件。

由于 Entities 是分部类,您可以在单独的文件中添加其他功能。因此,创建一个名为 Entities 的新文件,并在其中实现部分方法 OnContextCreated 以连接事件

public partial class Entities
{
partial void OnContextCreated()
{
SavingChanges += OnSavingChanges;
}

void OnSavingChanges(object sender, EventArgs e)
{

var modifiedEntities = ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
foreach (var entry in modifiedEntities)
{
var modifiedProps = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).GetModifiedProperties();
var currentValues = ObjectStateManager.GetObjectStateEntry(entry.EntityKey).CurrentValues;
foreach (var propName in modifiedProps)
{
var newValue = currentValues[propName];
//log changes
}
}
}
}

如果您使用的是 EF 4.1,您可以通过 this article提取更改

关于c# - 使用 MVC 和 Entity Framework 实现审计日志/更改历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6867459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com