为什么model = newModel不起作用,但model.title = newModel.title有效?

时间:2011-11-04 18:07:29

标签: c# .net

我需要在数据库中编辑我的记录。我认为我做得不够好。我已经尝试使代码缩短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();
    }
}

你能帮我优化我的代码吗?

3 个答案:

答案 0 :(得分:2)

您需要阅读.NET使用的内存模型。设置dev = newDev将更改dev 变量的值,但变量具有本地范围。它不会更改引用同一对象的其他变量的值。

在这种情况下,您从中提取dev的上下文可能会跟踪它提取给您的dev,因此如果您更改其属性并调用 SaveChanges 然后它将知道要更改哪些值。

如果您只是尝试将所有值从一个对象复制到另一个对象而无需为每个属性手动编写一行代码,那么您应该能够use a tool like AutoMapper自动映射所有类似命名的对象从一个对象到另一个对象的属性。

答案 1 :(得分:1)

如果这不起作用,那么: 1. dev是一种参考类型 2. dev的引用被更改为指向另一个对象(newDev)

这意味着,您已经在使用对象脱离上下文。为了能够更新该对象,您首先要以某种方式将该对象附加到上下文,并使上下文知道它是某个现有实体的更新对象。

希望这会有所帮助。

答案 2 :(得分:1)

如果您正在使用实体框架(它看起来像?),那么您无法以这种方式更新实体。

实体框架使用更改跟踪来了解实体发生了哪些更改。为此,它保留了从该上下文加载的特定实例的列表,以及它们的初始状态,因此它可以在您在上下文上调用SaveChanges之前检测对这些实例所做的更改。

直接指定参考类型时,您只需重新引用参考。您没有更改初始对象实例。对该实例的现有引用(如实体框架在内部保留以跟踪更改的引用)不会更改,您最终将指向不同的对象实例。

所以,只需按照现在的方式使用您的代码。这是盲目更新每个字段的唯一方法。如果没有更新任何内容,则实体框架的更改跟踪应导致SaveChanges不执行任何操作。如果更新了某些内容,它将执行相应的SQL以将更改保留到数据库。