【问题标题】:dbcontext.SaveChanges(); not updating when replacing modeldbcontext.SaveChanges();更换模型时不更新
【发布时间】:2019-10-22 18:37:11
【问题描述】:

我对 Entity Framework 6 有疑问。

我正在尝试更新现有实体,但我想完全替换它,而不是一个一个地更新每个属性。当我替换一个属性并调用SaveChanges() 时,它会很好地保存到数据库中,但是如果我想简单地替换整个对象,它什么也不做。

下面注释掉的部分显然可以工作,但是当我尝试替换对象时(在我的例子中是 ninja.ToModel() 对象,它来自 Ninja 视图模型)它不起作用。

显然我遗漏了一些东西,我认为这与Attach() 有关,但到目前为止,我在互联网上找到的所有内容都让我感到困惑。什么是完全更新我想要的对象的正确方法?

public void SaveNinja()
{
    using (var context = new ManagerEntities())
    {
        Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);

        // nin.Name = ninja.Name;
        // nin.Strength = ninja.Strength;
        // nin.Agility = ninja.Agility;
        // nin.Intelligence = ninja.Intelligence;
        // nin.Gold = ninja.Gold;

        context.SaveChanges();
    }

    Close();
}

【问题讨论】:

    标签: c# entity-framework-6 dbcontext entities


    【解决方案1】:

    仅在下一行找到与您正在传递的Id 匹配的Ninja 对象。它显然不会更新找到的对象的属性,因为您没有告诉它这样做。

    Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);
    

    如果你不想一个一个地设置对象属性,你可以有一个公共方法来做。

    public class Ninja
    {
        public string Id { get; set; }
        public string Name { get; set; }
    
        public void SetNinja(Ninja ninja)
        {
            Id = ninja.Id;
            Name = ninja.Name;
        }
    }
    

    然后在找到对象时调用它:

    Ninja nin = context.Ninjas.Find(ninja.ToModel().Id);
    nin.SetNinja(ninja);
    

    【讨论】:

    • 谢谢,这正是我要找的。话虽如此,我不得不在 ViewModel 中而不是直接在 Model 本身中创建一个 SetNin​​ja() 方法,但这个想法是相同的并且有效。
    【解决方案2】:

    因此,如果您加载模型实例,您应该只更改值并保存它。您不希望数据库识别代表相同模型数据的两个实例。

    但是,如果您没有从数据库中加载任何内容,并且您完全自己制作以替换数据库条目,那么您需要做两件事来完成这项工作:

    1. 确保主 ID 字段(看起来您在此处将其称为 Id)设置为与要替换的对象相同。

    2. 保存之前,请执行以下操作:

      db.Attach(ninja).State = EntityStates.Modified;
      

      该代码 sn-p 做了两件事。首先,它将数据库附加到对象(本质上是告诉它“这是您应该使用的该模型的实例”)。
      然后,第二,它将State 设置为Modified,这会告诉数据库在调用SaveChanges() 时需要将其写回磁盘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多