在LINQ中更新对象

时间:2010-10-04 16:33:51

标签: c# asp.net linq

我正在尝试在Linq中进行更新。

public myFunc(MyItem newItem)
{
  using(var db = new myDataContext())
  {
     var item = (from o in db.myTable where o.id == myId select o).First();
     item = newItem;
     db.SubmitAllChanges();
  }
}

这不会更新对象,我猜item = newItem会更改项目以引用另一个。如果我更改了各个字段(item.Name = newItem.Name等),则会反映出更改,但我不想将MyItem类的内容分散到多个位置以降低可维护性。有没有办法在逐个字段的基础上制作item = newItem副本?

MyItem也与另一个表有关系,我想将newItem中的下级项更新为item。 (FWIW,没有添加或删除,只是更新。)是否有标准化的流程来执行此操作?

谢谢你的帮助。

5 个答案:

答案 0 :(得分:6)

好吧,MyItem应该是部分类 - 因此您可以向CopyPropertiesFrom添加MyItem方法,然后编写

item.CopyPropertiesFrom(newItem);

而不是您当前的作业。

顺便说一句,您可能需要考虑使用此代替当前查询:

var item = db.myTable.First(o => o.id == myId);

在这种情况下,只需使事情比查询表达式简单:)

答案 1 :(得分:4)

您不能只将newItem分配给item。当您将newItem分配给item时,它只是将项目指向内存中的新位置...它实际上并未更新实体上的任何内容。

您需要单独分配每个属性:

using(var db = new myDataContext())
{
    var item = db.myTable.First(o => o.id == myId);
    item.Prop1 = newItem.Prop1;
    item.Prop2 = newItem.Prop2;
    // etc
}

更好的选择是从实体模型扩展部分类(如Jon Skeet所述)并使其成为一个方法(这样您就可以重用代码)。

答案 2 :(得分:2)

我认为您首先应该对C#变量和引用的基本概念有所了解。

C#中的类型分为两组:引用类型值类型。它们在许多方面都不同,复制和比较是这些方面之一。

值类型包括简单类型,如int(注意:string不是值类型,尽管您可能这么认为),枚举和结构。当您将值重新分配给不同的变量,将它们作为参数传递时,它们会被复制。

int x = 5;
int y = 7;
x = y;

您将y的值分配给x,这会使x等于7
但是,如果您进一步更改yx将无法更新:

int x = 5;
int y = 7;
x = y; // 7
y = 10; // x is still 7

相反,引用类型不会在作业时被复制。它只是被复制的引用。

MyItem john = new Customer("John");
MyItem jack = new Customer("Jack");
jack = john; // now both references point to the same Customer

在此代码段中,我们忘记了关于名为Customer的{​​{1}},"Jack"jack现在指向名称为{的同一个对象{1}}。

因此,请说

john

你只会"John"指向当时item = newItem; 引用的对象(如果它为空则为null)。

您可能希望在类中定义执行赋值例程的item方法:

newItem

在某些时候,您可能还想编写一个使用反射来分配所有公共属性的扩展方法 - 但这对于另一个问题来说是一个很好的主题(很可能已经多次询问和回答)。

答案 3 :(得分:0)

给它相同的密钥并做一个附加后跟一个submitchanges ....

答案 4 :(得分:0)

另一种选择是使用AutoMapper自动复制值 你。

上面说过,在很多情况下,部分类中的简单方法也可以做得很好(比如Jon Skeet的回答)。