我正在使用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();
}
有没有办法可以通过分配对象来更新每个属性?
答案 0 :(得分:2)
这绝对不会起作用:
Foo existingFoo = context.Foos.Where(x => x.Id == id).First();
existingFoo = value;
你正在查找它,然后立即用完全不同的东西覆盖引用。
我想你想attach
你的value
上下文,然后进行保存。更多like this可能会为您做到这一点:
context.Foos.AddObject(value);
context.ObjectStateManager.ChangeObjectState(value, System.Data.EntityState.Modified);
context.SaveChanges();
这不需要先加载要更新的对象,这很好。如果没有这样做,那么知道这被称为disconnected
更新之类的内容可能有助于您将来的Google搜索。
如果您已经拥有要更新的对象以及新副本,我不知道有什么干净可以为您合并它们。
之前I've done it的另一种方式看起来更像是这样,可能会觉得不那么苛刻:
var entity = context.Entry(value);
entity.State = EntityState.Modified;
context.SaveChanges();
或者更简洁:
context.Entry(value).State = EntityState.Modified;
context.SaveChanges();
我不记得这是不是内置的东西。
答案 1 :(得分:1)
简短回答:不。
但是有很多方法可以获得相同的结果,我编写了一段代码,使用反射来复制对象的所有属性:
public void CopyLinqObject(object obj_source, object obj_dest)
{
Type t_source = obj_source.GetType();
PropertyInfo[] p_source = t_source.GetProperties();
Type t_dest = obj_dest.GetType();
PropertyInfo[] p_dest = t_dest.GetProperties();
foreach (PropertyInfo ps in p_source)
{
foreach (PropertyInfo pd in p_dest)
{
if (ps.Name == pd.Name)
{
if (ps.PropertyType == pd.PropertyType)
{
if (ps.PropertyType.IsSerializable)
{
pd.SetValue(obj_dest, ps.GetValue(obj_source, null), null);
}
}
else
{
if (ps.PropertyType.BaseType == pd.PropertyType.BaseType)
{
if (ps.PropertyType.IsSerializable)
{
if (ps.GetValue(obj_source, null) != null)
{
try
{
pd.SetValue(obj_dest, ps.GetValue(obj_source, null), null);
}
catch
{
}
}
}
}
}
}
}
}
}
答案 2 :(得分:0)
您不能以这种方式将一个对象的属性“分配”给另一个对象。您的代码只是更改变量existingFoo的值。
您可以实现自己的属性复制代码,也可以查看将类附加到现有数据上下文。
答案 3 :(得分:0)
有没有办法可以通过分配对象来更新每个属性?
否,EF跟踪随属性更改,他们的类实现inotifypropertychanged
,当您只更改变量引用时,您没有更改属性。