我有以下代码
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();
有什么建议吗?
答案 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,并正确验证记录。
因此,每当我们需要强制和更新数据时,我们都需要使用第二个语句。