更新时,标记实体日期时间属性不变



我的域模型中有这个实体服务,它具有两个日期时间类型属性entrydate和updatedon。

当用户在编辑视图中进行任何更改并提交表单时,我希望将回发/修改对象的entrydate属性标记为未更改,以便在执行更新时不能覆盖entrydate。

public class Service
{
    public int ServiceID
    {
        get;
        set;
    }
    [Required(ErrorMessage="Please enter Name")]
    public string Name
    {
        get;
        set;
    }
    [Required(ErrorMessage="Please enter the duration for the service")]
    public short Duration
    {
        get;
        set;
    }

    [DataType(DataType.Date)]
    public DateTime EntryDate
    {
        get;
        set;
    }
    [DataType(DataType.Date)]
    public DateTime UpdatedOn
    {
        get;
        set;
    }

    public decimal Cost
    {
        get; set;
    }
}

将更改持久化到db的存储库方法如下:

 public void InsertOrUpdate(Service service)
    {
        if (service.ServiceID == default(int)) {
            // New entity
            context.Services.Add(service);
        } else {
            // Existing entity
            context.Entry(service).State = EntityState.Modified;
        }
    }

您可以从数据库中重新加载原始实体:

else {
    // Existing entity
    var serviceInDb = context.Services.Find(service.ServiceID);
    service.EntryDate = serviceInDb.EntryDate;
    context.Entry(serviceInDb).CurrentValues.SetValues(service);
}

当你以后调用SaveChanges时,UPDATE语句只会被发送到数据库(对于其他未改变的属性也有好处)。

或者只是重新加载EntryDate:

else {
    // Existing entity
    var entryDateInDb = context.Services
        .Select(s => s.EntryDate)
        .Single(s => s.ServiceID == service.ServiceID);
    service.EntryDate = entryDateInDb;
    context.Entry(service).State = EntityState.Modified;
}
context.Services.Attach(service); // thanks to user202448, see comments
context.Entry(service).Property(s => s.Name).IsModified = true;
context.Entry(service).Property(s => s.Duration).IsModified = true;
context.Entry(service).Property(s => s.UpdatedOn).IsModified = true;
context.Entry(service).Property(s => s.Cost).IsModified = true;

因此,不要将EntryDate属性设置为modified,而是将所有其他属性逐一设置。

想到的方法是…

context.Entry(service).State = EntityState.Modified;
context.Entry(service).Property(s => s.EntryDate).IsModified = false;

…不幸的是不能工作,因为设置属性为未修改,已经标记为Modified是不支持的,并会抛出异常。

最新更新