【问题标题】:How to deal with database transaction tracking with Entity Framework如何使用实体框架处理数据库事务跟踪
【发布时间】:2014-02-12 17:44:06
【问题描述】:

对于我正在开发的 ASP.NET MVC 应用程序,我的实体与预先存在的表相冲突,这些表具有旨在跟踪数据库事务的列(LastModDate、LastModByUserId、CreateDate、CreateByUserId),但未设置他们自己的触发器来自动填充这些列。我有点脱离了我的舒适区,因为过去我只使用通过数据库触发器填充这些列或手动完成事务跟踪但在单独的表中的表(通常是我在处理中看到的)与 ESB 和订购系统)。

我对为什么以这种方式设置这些列的假设是在用户经过身份验证但 Web 应用程序与数据库的连接是通过应用程序用户帐户完成的情况下覆盖与用户身份相关的字段。

所以我的问题是在设计映射到这些表的模型时,我是否只是扩展“DBEntity”类型类并在进行任何修改之前调用“更新/更新”例程?此外,这些类型的手动填充事务列是否常见?谢谢。

public class DBEntity
{
    //Primary Key
    public int Id { get; set; }
    public DateTime LastModDate {get; set;}
    public int LastModByUserId {get; set;} 
    public DateTime CreateDate {get; set;}
    public int CreateByUserId {get; set;}

    public DBEntity(UserLogin currentUser)
    {
        CreatedDate=DateTime.Now;
        CreatedByUserId=currentUser.Id;
        Updated (UserLogin);
    }
    public void Updated (UserLogin user)
    {
        LastModDate =DateTime.Now;
        LastModUserId =user.Id;
    }
}
public class UserLogin : DBEntity
{        
    public string Name { get; set; }
    public string UserName { get; set; }
    public string UserPassword { get; set; }
}

【问题讨论】:

    标签: c# sql-server entity-framework theory


    【解决方案1】:

    您可以将属性集方法设置为受保护/私有,并使用 MVC 与 html 帮助器执行类似的操作。

    所以你最终会得到类似的东西:

    someEntity.Update( x => x.Property, propertyValue, user);
    

    如果您感到困惑,我可以发布 Update 方法声明。

    我不确定这种情况是否常见,但我当然认为将其实现为数据库触发器会更好。但是,如果您必须手动完成,我认为这是自动化流程的最佳方法。

    编辑:

    给你

    public class DBEntity
    {
        public short Prop1 { get; protected set; }
        public string Prop2 { get; protected set; }
    
        public DBEntity()
        {
        }
    
        public void Update<T>( Expression<Func<DBEntity, T>> outExpr, T value)
        {
            if (value != null)
            {
                var expr = (MemberExpression)outExpr.Body;
                var prop = (PropertyInfo)expr.Member;
                prop.SetValue(this, value, null);
            }
        }
    
    }
    

    测试:

    static void Main(string[] args)
    {
        DBEntity e = new DBEntity();
        e.Update<string>(x => x.Prop2, "test");
        Console.WriteLine(e.Prop2);
    }
    

    如果您还有任何问题,请给我留言。祝你好运!

    【讨论】:

    • 您介意发布更新方法声明吗?那将有很大帮助!谢谢科尔纳。
    【解决方案2】:

    您可以考虑重写 DbContext.SaveChanges() 方法来更新您的创建/更新跟踪字段(ObjectContext 有一个 SavingChanges 事件,如果您使用它而不是 DbContext)。

    您可能希望为字段创建一个接口,然后在SaveChanges() 中您可以使用ChangeTracker 查找添加和修改的实体,如果它们实现了您的接口,则转换并更新属性。

    This answer 有一些类似的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多