Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 实体框架:将字段更新为空值?_C#_Entity Framework - Fatal编程技术网

C# 实体框架:将字段更新为空值?

C# 实体框架:将字段更新为空值?,c#,entity-framework,C#,Entity Framework,我正在使用存根更新实体,当更新的实体由值从非null变为null的列组成时,null不会持久化到数据库,即记录继续保存以前的非null值 我做错了什么 public void UpdateEntity(Entity e) { _context.Works.Attach(new Entity{ Id = e.Id }); _context.ApplyCurrentValues("Entities", e); _

我正在使用存根更新实体,当更新的实体由值从非null变为null的列组成时,null不会持久化到数据库,即记录继续保存以前的非null值

我做错了什么

public void UpdateEntity(Entity e)
        {
            _context.Works.Attach(new Entity{ Id = e.Id });
            _context.ApplyCurrentValues("Entities", e);
            _context.SaveChanges();
        }

问题是,您需要在
Attach()
之后,而不是之前,为这些属性分配
null
。也许
ApplyCurrentValues()
只复制不相同的属性?(我从未进行过测试,但如果进行了测试,这将是合理的。)

尽量避免使用“附加”加载实体。如果您只是从DB获取实体,则不必为空项上的设置标志费心:

var stage = Db.Stages.First(s => s.ID == someId);
stage.Notation = vm.Notation; // can be also null
Db.SaveChanges();

取决于你的关系是什么,如果你有一个关系,你需要确保它是0..1,而不是1对多。我试图为空的值是简单的数据库列(即date/integer/varchar);虽然还有其他实体与该实体有1…多个关系,但它们没有被任何方式修改。谢谢Craig,我认为这确实可能是问题所在。在触发ApplyCurrentValues()之前,我无法附加实体,因为它会破坏我的存储库模式。为了解决这个问题,我被迫检索实体,并手动让更新的分离实体的值在调用SaveChanges()之前更新检索到的附加实体的值。如果有办法避免检索实体,我会洗耳恭听。应该将整个对象标记为已修改。