为什么model = newModel不起作用,而是model.title = newModel.标题的作品
本文关键字:newModel model 标题 不起作用 为什么 而是 title | 更新日期: 2023-09-27 18:13:43
我需要编辑我在数据库中的记录。我觉得我做得还不够好。我已经尝试通过dev = newDev;
使代码更短,但它没有保存它。
[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(Dev newDev)
{
try
{
if (TryUpdateModel(newDev) == true)
{
var dev = _db.Devs.Where(x => x.ID == newDev.ID).Single();
dev.Title = newDev.Title;
dev.Body = newDev.Body;
dev.Tags = newDev.Tags;
dev.Image1 = newDev.Image1;
dev.Image2 = newDev.Image2;
dev.Image3 = newDev.Image3;
dev.Image4 = newDev.Image4;
_db.SubmitChanges();
return RedirectToAction("");
}
else
{
return Content("Fail.");
}
}
catch
{
return View();
}
}
你能帮我优化我的代码吗?
您将需要仔细阅读。net使用的内存模型。设置dev = newDev
将改变dev
变量的值,但是变量具有局部作用域。它不会改变引用同一对象的其他变量的值。
在这种情况下,您从中提取dev
的上下文可能会跟踪它提取并给您的dev
,因此,如果您更改其属性并调用SaveChanges,那么它将知道要更改哪些值。
如果您只是试图将所有值从一个对象复制到另一个对象,而不必为每个属性手动编写一行代码,那么您应该能够使用AutoMapper之类的工具将所有类似命名的属性从一个对象自动映射到另一个对象。
如果你正在使用实体框架(它看起来像?),那么你不能以这种方式更新实体。
实体框架使用变更跟踪来了解发生在实体上的变更。为此,它保留了从该上下文中加载的特定实例的列表,以及它们的初始状态,因此它可以检测在上下文中调用SaveChanges
之前对这些实例进行了哪些更改。
当你直接赋值给引用类型时,你只是在重置引用的位置。您没有更改初始对象实例。对该实例的现有引用(如实体框架在内部保存以跟踪更改的实例)不会更改,并且您将最终指向不同的对象实例。
所以,就按你现在的方式使用你的代码。这是盲目更新每个字段的唯一方法。如果没有更新,实体框架的变化跟踪应该导致SaveChanges
什么也不做。如果更新了某些内容,它将执行相应的SQL以将更改持久化到DB。
如果这不起作用,那么:1. Dev是一个引用类型2. dev的引用被更改为指向另一个对象(newDev)
这意味着,您已经在上下文之外处理对象。为了能够更新那个对象,你首先需要以某种方式将那个对象附加到上下文并使上下文意识到它是某个现有实体的更新对象。