C# dbcontext.SaveChanges();替换模型时不更新
我对实体框架6有问题 我试图更新一个现有的实体,但我想完全替换它,而不是逐个更新每个属性。当我替换一个属性并调用C# dbcontext.SaveChanges();替换模型时不更新,c#,entity-framework-6,dbcontext,entities,C#,Entity Framework 6,Dbcontext,Entities,我对实体框架6有问题 我试图更新一个现有的实体,但我想完全替换它,而不是逐个更新每个属性。当我替换一个属性并调用SaveChanges()时,它会很好地保存到数据库中,但是如果我只想替换整个对象,它什么也不做 下面被注释掉的部分显然可以工作,但是当我尝试替换对象(在我的例子中是ninja.ToModel()对象,它来自于一个ninja视图模型)时,它不起作用 显然,我遗漏了一些东西,我认为这与Attach()有关,但到目前为止,我在互联网上找到的所有东西都让我感到困惑。什么是完全更新我想要的对象
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();
}
下一行仅查找与您要传递的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);
因此,如果加载模型实例,只需更改值并保存即可。您不希望数据库识别表示相同模型数据的两个实例 但是,如果您没有从数据库中加载任何内容,并且您完全是自己进行此操作来替换数据库条目,那么您需要做两件事来实现此操作:
ID
)设置为与要替换的对象相同db.Attach(ninja).State = EntityStates.Modified;
这个代码片段有两个作用。首先,它将数据库附加到对象(本质上告诉它“这是您应该使用的模型的实例”)。然后,第二,它将
状态设置为Modified
,这告诉数据库在调用SaveChanges()
时需要将其写回磁盘
谢谢,这就是我要找的。也就是说,我必须在ViewModel中创建一个SetNinja()方法,而不是直接在模型本身中创建,但是这个想法是相同的,并且是有效的。