2016-12-06 234 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"); 

     }       
}