2016-12-06 25 views
0

新しいMVCアプリケーションの「編集」ページに問題があります。私は部屋を作成する「作成」メソッドを持っていて、DateTime.Nowを使ってCreatedDateを追加しています。Entity Framework 6 - データベースの更新

問題は私がこのエントリを編集するとき、私がそれを指定しなければCreatedDateをクリアすることです。私がそれを指定した場合(下に示すように)、現在のDateTime.Nowが追加されます(実際には変更日です)。

私のメソッドを変更してRoomTypeIDとDescriptionだけを更新し、既存の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

あなたが使用しようとしているように見える説明してきたものから、オブジェクトを更新するCreateメソッド。既存のオブジェクトを更新するには、別の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"); 

     }       
} 
関連する問題