При обновлении маркировки сущности свойство datetime без изменений - PullRequest
1 голос
/ 22 сентября 2011

У меня есть эта служба сущностей в моей доменной модели с двумя свойствами типа datetime 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;

    }
}

Метод репозитория, который сохраняет изменения в БД, выглядит следующим образом:

 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;
        }
    }

1 Ответ

1 голос
/ 23 сентября 2011

Вы можете перезагрузить исходную сущность из базы данных:

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 как измененное, а все остальные свойства по одному.

Подход, который приходит в голову ...

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

... к сожалению, не работает, потому что возврат свойства к неизмененному, которое уже помечено как Modified, не поддерживается и вызовет исключение.

...