我可以将对象分配给实体对象吗?

时间:2013-04-19 14:37:49

标签: c# entity-framework-4

我正在使用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();
}

有没有办法可以通过分配对象来更新每个属性?

4 个答案:

答案 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,当您只更改变量引用时,您没有更改属性。