Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# dbcontext.SaveChanges();替换模型时不更新_C#_Entity Framework 6_Dbcontext_Entities - Fatal编程技术网

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

C# dbcontext.SaveChanges();替换模型时不更新,c#,entity-framework-6,dbcontext,entities,C#,Entity Framework 6,Dbcontext,Entities,我对实体框架6有问题 我试图更新一个现有的实体,但我想完全替换它,而不是逐个更新每个属性。当我替换一个属性并调用SaveChanges()时,它会很好地保存到数据库中,但是如果我只想替换整个对象,它什么也不做 下面被注释掉的部分显然可以工作,但是当我尝试替换对象(在我的例子中是ninja.ToModel()对象,它来自于一个ninja视图模型)时,它不起作用 显然,我遗漏了一些东西,我认为这与Attach()有关,但到目前为止,我在互联网上找到的所有东西都让我感到困惑。什么是完全更新我想要的对象

我对实体框架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();
}
下一行仅查找与您要传递的
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字段(看起来您在这里调用了它
    ID
    )设置为与要替换的对象相同

  • 保存前,请执行以下操作:

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


  • 谢谢,这就是我要找的。也就是说,我必须在ViewModel中创建一个SetNinja()方法,而不是直接在模型本身中创建,但是这个想法是相同的,并且是有效的。