实体框架:在多个表中创建/更新公共字段
本文关键字:创建 更新 字段 框架 实体 | 更新日期: 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);
}
}