C# 如何使用EntityFramework 5实现审计跟踪?

C# 如何使用EntityFramework 5实现审计跟踪?,c#,.net,asp.net-mvc,entity-framework-5,C#,.net,Asp.net Mvc,Entity Framework 5,我试图在实体框架5中实现审计跟踪 public class AuditZoneRepository : IAuditZoneRepository { private AISDbContext context = new AISDbContext(); public int Save(AuditZone model, ModelStateDictionary modelState) { if (model.Id ==

我试图在实体框架5中实现审计跟踪

public class AuditZoneRepository : IAuditZoneRepository
    {
        private AISDbContext context = new AISDbContext();

        public int Save(AuditZone model, ModelStateDictionary modelState)
        {
            if (model.Id == 0)
            {
                context.AuditZones.Add(model);
            }
            else
            {
                var recordToUpdate = context.AuditZones.FirstOrDefault(x => x.Id == model.Id);
                if (recordToUpdate != null)
                {
                    recordToUpdate.Description = model.Description;
                    recordToUpdate.Valid = model.Valid;
                    recordToUpdate.ModifiedDate = DateTime.Now;
                }
            }

            try
            {
                context.SaveChanges();
                return 1;
            }
            catch (Exception ex)
            {
                modelState.AddModelError("", "Database error has occured.  Please try again later");
                return -1;
            }
        }
    }
为此,我需要
实体的
ObjectStateEntry

entities.ObjectStateManager.GetObjectStateEntry(changedEntity);
如图所示

当我尝试将其添加到save函数时,它表示未知。在我的案例中,实体的价值是什么

在Georges的帮助下,我更新了我的保存代码,如下所示:

 public int Save(AuditZone model, ModelStateDictionary modelState)
        {
            if (model.Id == 0)
            {
                context.AuditZones.Add(model);
            }
            else
            {
                var recordToUpdate = context.AuditZones.FirstOrDefault(x => x.Id == model.Id);
                if (recordToUpdate != null)
                {
                    recordToUpdate.Description = model.Description;
                    recordToUpdate.Valid = model.Valid;
                    recordToUpdate.ModifiedDate = DateTime.Now;


                    var objectContext = ((IObjectContextAdapter)context).ObjectContext;

                    var entires = objectContext.ObjectStateManager.GetObjectStateEntry(recordToUpdate);

                    IEnumerable<string> modifiedProperties = entires.GetModifiedProperties();
                }
            }

            try
            {




                context.SaveChanges();
                return 1;
            }
            catch (Exception ex)
            {
                modelState.AddModelError("", "Database error has occured.  Please try again later");
                return -1;
            }
        }
public int Save(审核区模型,ModelStateDictionary modelState)
{
如果(model.Id==0)
{
context.AuditZones.Add(模型);
}
其他的
{
var recordToUpdate=context.AuditZones.FirstOrDefault(x=>x.Id==model.Id);
if(recordToUpdate!=null)
{
recordToUpdate.Description=模型.Description;
recordToUpdate.Valid=model.Valid;
recordToUpdate.ModifiedDate=DateTime.Now;
var objectContext=((IObjectContextAdapter)context).objectContext;
var entires=objectContext.ObjectStateManager.GetObjectStateEntry(recordToUpdate);
IEnumerable modifiedProperties=entires.GetModifiedProperties();
}
}
尝试
{
SaveChanges();
返回1;
}
捕获(例外情况除外)
{
modelState.AddModelError(“,”发生数据库错误。请稍后重试”);
返回-1;
}
}
但是当我调试它时,modifiedProperties没有结果?我是否将此代码放错了位置?

摘自您发布的:

“我们必须在ObjectContext上使用ObjectStateManager。”

因此,
实体
应该是
对象上下文
的实现

要将
DbContext
转换为
ObjectContext
使用:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
要获取条目,请使用:

var entires = objectContext.ObjectStateManager
                           .GetObjectStateEntries(EntityState.Unchanged);
有关
ObjectContext
及其与
DbContext
的关系的详细信息:


确切的错误信息是什么?您可以发布异常的堆栈跟踪吗?没有错误消息。。没有名为AuditZone.ObjectStateManagerf的方法。对于审核,您还可以覆盖DbContext中的SaveChanges(),以审核实体中的所有更改。看一看:可能会看一看谢谢洛佩兹..乔治-谢谢你,我更新了我的代码,仍然有问题