我正在使用 ASP.NET MVC4 Web API 和我的 PUT 操作,我想做这样的事情:
public void Put(string id, [FromBody]Foo value)
{
var context = new FooBarEntities();
Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
existingFoo = value;
context.SaveChanges();
}
但是 Foo value
对象中的更改没有保存。如果我要做每个属性,它会像这样工作:
public void Put(string id, [FromBody]Foo value)
{
var context = new FooBarEntities();
Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
existingFoo.Prop1 = value.Prop1;
existingFoo.Prop2 = value.Prop2;
context.SaveChanges();
}
有没有一种方法可以通过分配对象来更新每个属性?
最佳答案
这绝对行不通:
Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
existingFoo = value;
您正在查找它,然后立即用完全不同的内容覆盖引用。
我认为您想将附加
您的值
到上下文,然后进行保存。更多 like this可能会为你做:
context.Foos.AddObject(value);
context.ObjectStateManager.ChangeObjectState(value, System.Data.EntityState.Modified);
context.SaveChanges();
这不需要您首先加载要更新的对象,这很好。如果这样做不行,那么知道这称为 disconnected
之类的更新可能有助于您 future 的谷歌搜索。
如果您手头已有要更新的对象以及新副本,我不知道有什么干净的东西可以为您合并它们。
另一种方式I've done it before 看起来更像是这样,这可能感觉不那么骇人听闻:
var entity = context.Entry(value);
entity.State = EntityState.Modified;
context.SaveChanges();
或者更简洁:
context.Entry(value).State = EntityState.Modified;
context.SaveChanges();
不过,我不记得那是不是内置的东西。
关于c# - 我可以将对象分配给实体对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107179/