如果我们直接将新对象值分配给旧的,Linq to sql可以跟踪更新信息。?

时间:2017-05-13 04:15:21

标签: c# linq

我有以下代码

Customer customer = (from x in db.Customers where x.CustomerID.Equals(cust.CustomerID.Value) select x).SingleOrDefault();

customer = newcustomer;
db.SubmitChanges();

通过执行上面的代码,我可以将新数据导入客户对象, 但是通过执行SubmitChanges(),它无法更新到数据库中。

我需要编写以下类型的机制来将值更新到数据库中。

customer.CustomerName = "James";
customer.DisplayName = "Jimmy";

db.SubmitChanges();

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您不能这样做,因为您更改了Customer customer = (from x in db.Customers where x.CustomerID.Equals(cust.CustomerID.Value) select x).SingleOrDefault(); 指向的引用。因此,ORM会丢失您从数据库中检索的对象所做的更改。实际上,当您从dabase获取特定客户的记录时,如下所示:

CustomerName

您创建一个对象,其属性具有您提取的记录中的值。稍后您更改customer.CustomerName = "James";

的值
SubmitChanges

然后调用db.SubmitChanges(); 方法:

CustomerName

运行一个进程,该进程检测对该对象所做的任何更改。此过程发现您已更改customer的值,并且ORM将创建适当的UPDATE语句。最后这个语句被发送到数据库,以便执行。

另一方面,如果您更改...\main.cpp|19|note: 'detail::is_value<int, true>' is not literal because:| ...\main.cpp|19|note: 'detail::is_value<int, true>' has a non-trivial destructor| 的值,更改检测进程将决定检索到的记录没有任何更改。为什么会发生这种情况是因为 ORM知道记录的唯一方法是通过它在检索后对创建的对象的引用。改变这一点你会失去它的背景。

答案 1 :(得分:0)

如果您看到msdn,就会得到答案。

  

无论您对对象进行了多少更改,都会发生更改   只针对内存中的副本。你没有改变   数据库中的实际数据

     

当您调用SubmitChanges时,LINQ to SQL会检查已知对象集&gt;以确定是否已将新实例附加到它们。如果有,则&gt;这些新实例将添加到跟踪对象集中。

有2个陈述

customer = newcustomer;

此语句只是更新内存中的值或引用。

db.SubmitChanges();

该语句将所有更改,即内存中的insert,update,delete语句提交给db end,并正确验证记录。

因此,每当我们需要强制和更新数据时,我们都需要使用第二个语句。