Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ中更新对象_C#_Asp.net_Linq - Fatal编程技术网

C# 在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

我正在尝试在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更改为引用其他对象。如果我更改单个字段(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
}

在某些情况下,您可能还希望编写一个扩展方法,使用反射来分配所有公共属性,但对于不同的问题(很可能已经被问过并回答过多次),这是一个很好的主题。

另一个选项是使用反射自动复制 你

如上所述,在许多情况下,一个简单的方法