我对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();
}
答案 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)
因此,如果您加载模型实例,则只需更改值并保存即可。您不希望数据库识别代表相同模型数据的两个实例。
但是,如果您没有从数据库中加载任何东西,而要完全自己替换数据库条目,那么您需要做两件事才能使它起作用:
确保将主要ID字段(看起来像您在这里称为onConfirm={YOUR_SUBMIT_FUNCTION} onCancel={()=>{this.setState({totalPrice: null})}}
)设置为与要替换的对象相同。
在保存之前,请执行以下操作:
Id
该代码段可做两件事。首先,它将数据库附加到对象(本质上告诉它“这是您应该使用的该模型的实例”)。
然后,第二步将db.Attach(ninja).State = EntityStates.Modified;
设置为State
,这告诉数据库在调用Modified
时需要将其写回磁盘。