bar*_*ron 31 c# asp.net-mvc audit 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);
}
...
}
Run Code Online (Sandbox Code Playgroud)
但问题是当代码检索"未编辑的虚拟机"时,这会导致EntityFramework中的一些意外更改 - 因此TryUpdateModel(object);抛出一个UpdateException.
所以问题是 - 在这种情况下 - 如何创建objectEntityFramework外部的副本来比较更改/审计历史记录,以便它根本不影响或更改EntityFramework
编辑:不想使用触发器.需要记录执行该操作的用户名.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Era*_*nga 23
如果您使用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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是EF 4.1,则可以阅读本文以提取更改
| 归档时间: |
|
| 查看次数: |
39066 次 |
| 最近记录: |