dbcontext.SaveChanges();替换模型时不更新

时间:2019-10-22 18:37:11

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

我对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();
}

2 个答案:

答案 0 :(得分:1)

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

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);

答案 1 :(得分:0)

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

但是,如果您没有从数据库中加载任何东西,而要完全自己替换数据库条目,那么您需要做两件事才能使它起作用:

  1. 确保将主要ID字段(看起来像您在这里称为onConfirm={YOUR_SUBMIT_FUNCTION} onCancel={()=>{this.setState({totalPrice: null})}})设置为与要替换的对象相同。

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

    Id

    该代码段可做两件事。首先,它将数据库附加到对象(本质上告诉它“这是您应该使用的该模型的实例”)。
    然后,第二步将db.Attach(ninja).State = EntityStates.Modified; 设置为State,这告诉数据库在调用Modified时需要将其写回磁盘。