实体框架:在多个表中创建/更新公共字段

本文关键字:创建 更新 字段 框架 实体 | 更新日期: 2023-09-27 17:59:06

我的网站使用EF和ASP.NET MVC。数据库中的所有表都有两个字段

LastModifiedBy-登录用户名

LastModifiedDate-今天的日期和时间

我可以在一个地方写一些代码吗?这些代码将在创建或更新表的行时将这些值输入到表中?

实体框架:在多个表中创建/更新公共字段

我就是这么做的。首先制作一个具有用户和时间所需属性的界面:

public interface IAudit
{
    DateTime? UpdatedOn { get; set; }
    int? UpdatedBy { get; set; }
}

并确保任何需要这些属性的实体都在实现它:

public class Car : IAudit
{
    //snip
    public DateTime? UpdatedOn { get; set; }
    public int? UpdatedBy { get; set; }
}

现在在您的上下文中:

public class MyContext : DbContext
{
    public MyContext()        
    {
        //Handle the SavingChanges event:
        var objectContext = ((IObjectContextAdapter)this).ObjectContext;
        objectContext.SavingChanges += objectContext_SavingChanges;
    }
    private void objectContext_SavingChanges(object sender, EventArgs e)
    {
        var context = (ObjectContext)sender;
        context.DetectChanges();
        foreach (var entry in context.ObjectStateManager
                        .GetObjectStateEntries(EntityState.Added | EntityState.Modified))
        {
            if (entry.Entity is IAudit)
            {
                if (entry.IsRelationship) continue;
                var auditEntry = (IAudit)entry.Entity;
                if (entry.State == EntityState.Modified)
                {
                    auditEntry.UpdatedOn = DateTime.Now;
                    auditEntry.UpdatedBy = GetUser();
                }
            }
        }
    }
}

尝试在数据上下文中重写ValidateEntity方法。下面是一个例子:

public partial class YourDataContext
{
    protected override System.Data.Entity.Validation.DbEntityValidationResult ValidateEntity(System.Data.Entity.Infrastructure.DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        if (entityEntry.Entity is Boat && entityEntry.State == System.Data.Entity.EntityState.Modified)
        {
            Boat modifiedBoat = (Boat)entityEntry.Entity;
            // Set your last modified date and other properties here
        }
        return base.ValidateEntity(entityEntry, items); 
    }
}