我需要从数据库加载一个对象,修改它的一些字段和关系,然后我想只为一个字段存储一个新值,而不修改其余字段。
它看起来像这样:
var thing = db.Things.First();
thing.Field1 = "asdas";
thing.Field2 = 23;
thing.OtherThings.Add(new OtherThing());
thing.FieldToUpdate = doSomething(thing);
db.SaveChanges();
但这会保存所有更改,我想要的只是保存FieldToUpdate ...
我环顾四周,所有我发现的是使用存储过程,对于看起来如此简单的东西来说似乎太过分了,而且每次我需要做一些不同的存储过程像这样...
我目前的解决方案是打开另一个上下文,再次加载,更新FieldToUpdate和SaveChanges,但这既低效又丑陋。
答案 0 :(得分:2)
如果要对附加实体执行此操作,则必须先更新FieldToUpdate并调用SaveChanges。您可以更新其他字段,并在需要时再次调用SaveChanges。附加实体没有其他办法。
您可以尝试的其他方式是分离实体,修改您想要的内容(它不会跟踪更改)。然后将实体附加回上下文并调用:
// I suppose that db is ObjectContext or inherited type
db.ObjectStateManager.GetObjectStateEntry(thing).SetModifiedProperty("FieldToUpdate");
现在只跟踪FieldToUpdate已更改。
答案 1 :(得分:0)
实体框架非常智能,可以找出已更改的内容和未更改的内容,并相应地优化了SQL语句的使用。如果您只更改FieldToUpdate,那么SQL语句将只是单个字段的更新,而不是所有内容的更新。
但是,如果你确实改变了Field1和Field2,它们也将被保留,但只有在它们发生变化时才会被保留。否则,没有必要告诉DB将其更改为已有的。
实体框架就是这样做的,因为这正是开发人员99.9%的时间所需要的。如果您打算将实体对象用作要移动的对象并以不同于将其视为数据库模型的方式进行操作(就像应该这样),那么您可能需要考虑创建另一个新的包装类这可以让你搞乱你想要的所有数据字段(以及其他不在其中的数据字段),然后让它的save方法执行适当的实体框架持久性,以保持分离和清洁。