例如,我的所有实体类都有一个“CreateDate”属性,使用的是 EF 4.3 Code First。我想防止对该字段的任何更改发送到数据库,除非是在首次创建对象时。
现在我可以将此属性设为只读,但我使用的是 MVC4 前端,这需要在 HTTP POST 操作期间实例化一个新对象并将其绑定到传入的属性值。然后我可以读取原始对象并根据它设置值,这不太有效,或者将值存储在不太安全的隐藏字段中。
当我的 DbContext 保存更改时,我希望简单地禁止对此字段的任何更新。我可以这样做吗?如何?
例如,我的所有实体类都有一个“CreateDate”属性,使用的是 EF 4.3 Code First。我想防止对该字段的任何更改发送到数据库,除非是在首次创建对象时。
现在我可以将此属性设为只读,但我使用的是 MVC4 前端,这需要在 HTTP POST 操作期间实例化一个新对象并将其绑定到传入的属性值。然后我可以读取原始对象并根据它设置值,这不太有效,或者将值存储在不太安全的隐藏字段中。
当我的 DbContext 保存更改时,我希望简单地禁止对此字段的任何更新。我可以这样做吗?如何?
我会为实体使用标记接口,CreateDate
然后我会在设置或重置值DbContext.SaveChanges
的帮助下覆盖然后。ChangeTracker
CreatedAt
也许这听起来很复杂,但我创建了一个小示例,您可以从中开始:
public interface ICreatedAt
{
DateTime CreatedAt { get; set; }
}
public class MyEntity : ICreatedAt
{
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
}
public class MyContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<ICreatedAt>())
{
if (entry.State == System.Data.EntityState.Added)
{
entry.Entity.CreatedAt = DateTime.Now;
}
if (entry.State == System.Data.EntityState.Modified)
{
entry.Entity.CreatedAt =
entry.OriginalValues.GetValue<DateTime>("CreatedAt");
}
}
return base.SaveChanges();
}
}