我有,例如使用EF 4.3 Code First在我的所有实体类上创建'CreateDate'属性。我想阻止对此字段的任何更改发送到数据库,除非首次创建对象。
现在我可以将此属性设置为只读,但我使用的是MVC4前端,这需要在HTTP POST操作期间实例化新对象并绑定到传入属性值。然后我可以读取原始对象并根据它设置值,这不是太高效,或者将值存储在隐藏字段中,这不太安全。
我最好在我的DbContext保存更改时简单地禁止对此字段进行任何更新。我可以这样做吗?怎么样?
答案 0 :(得分:4)
我会为具有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();
}
}