Asp.net mvc 实体框架6-更新数据库

Asp.net mvc 实体框架6-更新数据库,asp.net-mvc,controller,entity-framework-6,Asp.net Mvc,Controller,Entity Framework 6,我在新的MVC应用程序中的一个“编辑”页面出现问题。我有一个“create”方法,它创建一个房间,并使用DateTime.Now添加一个CreatedDate 我遇到的问题是,当我编辑这个条目时,如果我没有指定它,它会清除CreatedDate。如果我指定了它(如下所示),那么它会添加当前的DateTime.Now(因此它实际上是一个修改过的日期) 如何更改我的方法,使其仅更新RoomTypeID和描述,并保持现有CreatedDate不变 [HttpPost] [Validat

我在新的MVC应用程序中的一个“编辑”页面出现问题。我有一个“create”方法,它创建一个房间,并使用DateTime.Now添加一个CreatedDate

我遇到的问题是,当我编辑这个条目时,如果我没有指定它,它会清除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");
        }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建([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(房间);
等待db.saveChangesSync();
返回操作(“索引”);
}

也许我不明白你的意思,但你想更新,为什么不:

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

也许我不明白你的意思,但是你想要更新为什么不:

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

根据您的解释,您似乎试图使用Create方法更新对象。更新现有对象时,您需要有一个单独的ActionResult

我假设一个房间属于一个属性,并且一个属性有许多房间,您可以在其中进行编辑

您应该使用基本上是DTO(数据传输对象)的输入模型,这些模型与您更新的实体不同。相反,它们只保存您允许编辑的属性

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");

       }                          
 }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务更新(RoomInputModel RoomInputModel、int roomId、int propertyId)
{
if(ModelState.IsValid)
{
var room=db.room.FirstOrDefault(x=>x.ID==roomId&&x.PropertyID==PropertyID);
如果(房间!=null)
{
//从输入模型填充现有房间
room.Description=roomInputModel.Description;
room.ModifiedDate=DateTime.Now();
等待db.saveChangesSync();
返回操作(“索引”);
}                          
}

根据您的解释,您似乎试图使用Create方法更新对象。更新现有对象时,您需要有一个单独的ActionResult

我假设一个房间属于一个属性,并且一个属性有许多房间,您可以在其中进行编辑

您应该使用基本上是DTO(数据传输对象)的输入模型,这些模型与您更新的实体不同。相反,它们只保存您允许编辑的属性

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");

       }                          
 }
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务更新(RoomInputModel RoomInputModel、int roomId、int propertyId)
{
if(ModelState.IsValid)
{
var room=db.room.FirstOrDefault(x=>x.ID==roomId&&x.PropertyID==PropertyID);
如果(房间!=null)
{
//从输入模型填充现有房间
room.Description=roomInputModel.Description;
room.ModifiedDate=DateTime.Now();
等待db.saveChangesSync();
返回操作(“索引”);
}                          
}

是否需要在if(ModelState.IsValid)块中执行此操作?是否需要在if(ModelState.IsValid)块中执行此操作?