2016-12-06 10 views
0

У меня возникли проблемы с одной из моих «редактирующих» страниц в новом приложении MVC. У меня есть метод «create», который создает комнату и добавляет CreateDate, используя DateTime.Now.Entity Framework 6 - Обновление базы данных

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я редактирую эту запись, она очищает этот файл CreateDate, если я его не укажу. Если я укажу его (как показано ниже), он добавит текущую DateTime.Now (так что это фактически измененная дата).

Как изменить метод, чтобы он обновлял только RoomTypeID и описание и оставил существующий CreateDate в такт?

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Create([Bind(Include = "ID,RoomTypeID,Description")] Room room, int propertyId) 
    { 
     if (ModelState.IsValid) 
     { 
      room.ID = Guid.NewGuid(); 
      room.DateCreated = DateTime.Now; 
      room.PropertyID = propertyId; 
      db.Room.Add(room); 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index"); 
     } 

Спасибо, Гэвин

ответ

2

Может быть, я не понимаю вас, но с вы хотите сделать обновление почему бы не сделать:

Room room = db.Room.FirstOrDefault(x => x.ID == yourId); 
if(room!=null){ 
    room.RoomTypeID = X; 
    room.Description = Y; 
    db.Room.Attach(room); 
    db.Entry(room).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

Должен ли я сделать это внутри блока if if (ModelState.IsValid)? – Gavin5511

1

Из того, что вы объяснили это выглядит, как вы пытаетесь использовать Создать метод для обновления объектов. Для обновления существующего объекта необходимо иметь отдельный ActionResult.

Я собираюсь предположить, что комната принадлежит собственности, а свойство имеет много комнат, в которых вы хотите иметь возможность редактировать.

Вы должны использовать модели ввода, которые в основном являются объектами DTO (объекты передачи данных), которые не идентичны объектам, которые вы обновляете. Вместо этого они сохраняют только те свойства, которые вы разрешаете редактировать.

Свойства Entitiy, такие как Id и DateCreated, никогда не должны изменяться, поэтому они не принадлежат на inputModel.

[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> Update(RoomInputModel roomInputModel, int roomId, int propertyId) 
{ 
     if (ModelState.IsValid) 
     { 

     var room = db.Room.FirstOrDefault(x => x.ID == roomId && x.PropertyID == propertyId); 

     if(room!= null) 
     { 

     // Populate existing room from the input model 

     room.Description = roomInputModel.Description; 
     room.ModifiedDate = DateTime.Now(); 

     await db.SaveChangesAsync(); 
     return RedirectToAction("Index"); 

     }       
}