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