2

例如,我的所有实体类都有一个“CreateDate”属性,使用的是 EF 4.3 Code First。我想防止对该字段的任何更改发送到数据库,除非是在首次创建对象时。

现在我可以将此属性设为只读,但我使用的是 MVC4 前端,这需要在 HTTP POST 操作期间实例化一个新对象并将其绑定到传入的属性值。然后我可以读取原始对象并根据它设置值,这不太有效,或者将值存储在不太安全的隐藏字段中。

当我的 DbContext 保存更改时,我希望简单地禁止对此字段的任何更新。我可以这样做吗?如何?

4

1 回答 1

4

我会为实体使用标记接口,CreateDate然后我会在设置或重置值DbContext.SaveChanges的帮助下覆盖然后。ChangeTrackerCreatedAt

也许这听起来很复杂,但我创建了一个小示例,您可以从中开始:

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();
    }
}
于 2012-05-20T07:13:58.100 回答