2016-12-06 231 views
0

我在新的MVC應用程序中遇到了一個「編輯」頁面的問題。我有一個'創建'方法創建一個房間,並使用DateTime.Now添加一個CreatedDate。實體框架6 - 更新數據庫

我遇到的問題是,當我編輯這個條目,它會清除該CreatedDate,如果我不指定它。如果我指定它(如下所示),那麼它會添加當前的DateTime.Now(所以它實際上是一個修改日期)。

如何更改我的方法,使其只更新RoomTypeID和說明,並保留現有的CreatedDate?

[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(ModelState.IsValid)塊內做到這一點嗎? – Gavin5511

1

從你已經解釋它看起來像你試圖用用於更新對象的創建方法。您需要有一個單獨的ActionResult來更新現有對象。

我打算假設一個房間屬於一個房產,而一個房產有許多房間,您希望在其中進行編輯。

您應該使用基本上與您的更新實體不相同的DTO(數據傳輸對象)的輸入模型。相反,他們只擁有允許編輯的屬性。

IdDateCreated這樣的屬性不應該改變,所以它們不屬於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"); 

     }       
}