c# - 如果我们直接将新对象值赋给旧对象,为什么 Linq to sql 无法跟踪更新信息?

标签 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();

有什么建议吗?

最佳答案

您不能这样做,因为您更改了 customer 指向的引用。因此 ORM 会丢失您对从数据库中检索的对象所做的更改。实际上,当您从数据库中获取特定客户的记录时,如下所示:

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

您创建一个对象,其属性具有您获取的记录中的值。例如,稍后您更改 CustomerName

的值时
customer.CustomerName = "James";

然后调用 SubmitChanges 方法:

db.SubmitChanges();

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

另一方面,如果您更改 customer 的值,更改检测 过程将确定检索到的记录没有任何更改。发生这种情况的原因是ORM 知道记录的唯一方法是通过它在检索后对创建的对象的引用。改变这个你会从你的上下文中丢失它。

关于c# - 如果我们直接将新对象值赋给旧对象,为什么 Linq to sql 无法跟踪更新信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949129/

相关文章:

c# - 使用 PrintDocument 时出错

c# - 使用 linq 将数据添加到现有的 xml 文件

c# - 如何从 IQueryable.GroupBy 中选择最新日期?

c# - 在 xaml 中作为事件处理程序的静态函数

c# - 数据类型 DateTime 不显示时间

c# - 将多个 Include() 与嵌套 Select() 结合使用时出现 EntityCommandExecutionException

c# - 如何从表中删除元素?

c# - 在 linq 或 lambda 表达式中转换匿名对象的类型

c# - 如何返回一天的结果?

c# - Linq2Sql 取回数据点