我正在尝试在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,没有添加或删除,只是更新。)是否有标准化的流程来执行此操作?
谢谢你的帮助。
答案 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
。
但是,如果您进一步更改y
,x
将无法更新:
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的回答)。