如何跳过Code First数据库更新中的某些字段?

时间:2012-05-20 06:50:03

标签: entity-framework ef-code-first

我有,例如使用EF 4.3 Code First在我的所有实体类上创建'CreateDate'属性。我想阻止对此字段的任何更改发送到数据库,除非首次创建对象。

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

我最好在我的DbContext保存更改时简单地禁止对此字段进行任何更新。我可以这样做吗?怎么样?

1 个答案:

答案 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();
    }
}