C# 在LINQ中更新对象
我正在尝试在Linq中进行更新C# 在LINQ中更新对象,c#,asp.net,linq,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
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更改为引用其他对象。如果我更改单个字段(item.Name=newItem.Name等),则会反映出更改,但是我不想将MyItem类的内容分散到多个位置以降低可维护性。是否有办法使item=newItem逐字段复制
另外,MyItem与另一个表有关系,我想将下属项从newItem更新为item。(FWIW,没有添加或删除,只有更新。)是否有一个标准化的过程来执行此操作
谢谢您的帮助。您不能只将
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所述),并将其作为一种方法(这样您就可以重用代码)。您不能只将
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所述),并将其作为一种方法(这样您就可以重用代码)。那么,
MyItem
应该是分部类-这样您就可以将CopyPropertiesFrom
方法添加到MyItem
,然后编写
item.CopyPropertiesFrom(newItem);
而不是你现在的任务
顺便说一下,您可能想考虑使用这个代替当前查询:
var item = db.myTable.First(o => o.id == myId);
在这种情况下,只需使事情比查询表达式简单一点:)那么,
MyItem
应该是一个分部类-因此您可以将CopyPropertiesFrom
方法添加到MyItem
,然后编写
item.CopyPropertiesFrom(newItem);
而不是你现在的任务
顺便说一下,您可能想考虑使用这个代替当前查询:
var item = db.myTable.First(o => o.id == myId);
在这种情况下,只需要比查询表达式简单一点:)给它一个相同的键,然后做一个附加,然后再做一个submitchanges…给它一个相同的键,然后再做一个附加,然后再做一个submitchanges…我想你应该先了解一下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
在这个代码片段中,我们忘记了名为“Jack”的Customer
,而Jack
和john
现在都指向名为“john”的同一个对象
所以说
item = newItem;
您只能使item
指向当时newItem
引用的对象(如果为空则为null)
您可能希望在类中定义一个执行赋值例程的Assign
方法:
public void Assign(MyItem that)
{
this.Name = that.Name;
this.City = that.City;
// etc
}
在某个时候,您可能还想编写一个扩展方法,该方法使用反射来分配所有公共属性,但对于不同的问题来说,这是一个很好的主题(很可能已经被问过并回答过多次).我认为您应该首先了解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
在这个代码片段中,我们忘记了名为“Jack”的Customer
,而Jack
和john
现在都指向名为“john”的同一个对象
所以说
item = newItem;
您只能使item
指向当时newItem
引用的对象(如果为空则为null)
您可能希望在类中定义一个执行赋值例程的Assign
方法:
public void Assign(MyItem that)
{
this.Name = that.Name;
this.City = that.City;
// etc
}
在某些情况下,您可能还希望编写一个扩展方法,使用反射来分配所有公共属性,但对于不同的问题(很可能已经被问过并回答过多次),这是一个很好的主题。另一个选项是使用反射自动复制 你 如上所述,在许多情况下,一个简单的方法