我正在尝试使用TryUpdateModel
将单个项目保存到SQL Server表中。调试时,我可以看到需要更新的值,但db.SaveChanges()
调用没有保存它。
我的代码:
[HttpGet]
public PartialViewResult _SubmitRev(int? id)
{
return PartialView();
}
[HttpPost]
public PartialViewResult _SubmitRev(int? id, WriterSubjectReviewVm model)
{
var loggedInUserId = User.Identity.GetUserId();
var member = db.Members.SingleOrDefault(m => m.ApplicationUserId == loggedInUserId);
var MySubjectDetails = (from c in db.subjects.Where(s => s.SubjectId == id) select c).AsNoTracking().Single();
model.rev.SubjectId = (int)id;
model.sub.SubjectId = MySubjectDetails.SubjectId;
var bad = MySubjectDetails.Bad;
model.sub.Bad = bad;
if (model.rev.GBU == "Bad")
{
int iBadRating = Convert.ToInt32(bad);
iBadRating++;
model.sub.Bad = iBadRating;
}
if (ModelState.IsValid)
{
// TryUpdateModel(model.sub, "Subject");
TryUpdateModel(model.sub);
db.SaveChanges();
return PartialView();
}
return PartialView(model);
}
答案 0 :(得分:1)
查看您的代码,我会说您不会将模型重新附加到上下文中。让我们分解一下:
首先,您的模型作为新对象进入方法:
public PartialViewResult _SubmitRev(int? id, WriterSubjectReviewVm model)
然后使用数据库中的数据对其进行一些修改:
var MySubjectDetails = (from c in db.subjects.Where(s => s.SubjectId == id) select c).AsNoTracking().Single();
model.rev.SubjectId = (int)id;
model.sub.SubjectId = MySubjectDetails.SubjectId;
需要注意的重要提示您使用MySubjectDetails
提取.AsNoTracking()
,这会将断开连接从上下文中拉出来,因此这不会自动除非你重新贴上它,否则请保存。
然后将该断开连接的实体分配给您的模型:
var bad = MySubjectDetails.Bad;
model.sub.Bad = bad;
然后您修改了一些其他属性,然后检查模型是否有效并尝试保存:
if (ModelState.IsValid)
{
// TryUpdateModel(model.sub, "Subject");
TryUpdateModel(model.sub);
db.SaveChanges();
return PartialView();
}
您在任何时候都没有将model
对象重新连接到上下文(db
),因此当您致电.SaveChanges()
时,您要保存哪些内容?
在某个阶段,您需要将发布到您的Action的属性(以WriterSubjectReviewVm
视图模型的形式)映射回数据模型。否则,如果该视图模型实际上是一个数据模型(并且存在于某个集合中的数据库上下文中),那么您需要重新附加它:
db.WriterSubjectReviews.Attach(model)
或类似的东西 - 然后当你拨打SaveChanges()
时,它实际上会保存。