如何使用Entity Framework处理数据库事务跟踪

时间:2014-02-12 17:44:06

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

对于我正在开发的ASP.NET MVC应用程序,我的实体将违反预先存在的表,这些表具有用于跟踪数据库事务的列(LastModDate,LastModByUserId,CreateDate,CreateByUserId),但未设置为他们自己的触发器自动填充这些列。我有点不在我的舒适区域,因为过去我只使用过表格,这些表格通过数据库触发器填充这些列,或者手动完成事务跟踪,但是在一个单独的表格中(通常是我在交易中看到过的东西)与ESB和订购系统)。

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

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

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; }
}

2 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:0)

您可以考虑覆盖DbContext.SaveChanges()方法来更新您的创建/更新跟踪字段(如果您使用ObjectContext而不是SavingChangesDbContext会发生SaveChanges()事件

您可能希望为这些字段创建一个界面,然后在ChangeTracker中,您可以使用{{1}}查找添加和修改的实体,如果它们实现了您的界面,则转换和更新属性。

This answer有一些类似的代码。