c# - Linq-to-SQL With XML Database Fields——为什么这行得通?

标签 c# xml linq-to-sql .net-3.5

一些背景:我有一个数据库,我想使用 linq-to-sql 通过 C# 应用程序更新它。此表中的一列具有 XML 数据类型。

该表中的每个其他列(不是 XML 数据类型)都更新得很好,但是当我去更改 XML 字段时,程序(看似)正确执行,但该字段始终保留其原始状态运行 SubmitChanges() 后的值。

我环顾了互联网,在 Microsoft Connect 上找到了一些诊断类似问题的帖子,最后偶然发现了解决方案 here :

要强制更新 XML 字段,这是行不通的:

XElement tmp = MyLinqObject.XmlField;
MyLinqObject.XmlField = null;
MyLinqObject.XmlField = tmp;

与其强制 LINQ 更新 XML 列,不如分配一个克隆对象:

MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField);

我可以确认这似乎确实有效,但我不确定为什么。我唯一的猜测是 XmlField 属性在堆上有某种唯一标识符,通过克隆,您已经为其分配了一个新的唯一标识符。当 Linq 然后生成查询时,它甚至不会尝试查看该字段是否已更新,因为它有一个新的 ID,它只是将值写入数据库。但是,我只是推测,希望其他人可以更好地了解幕后发生的事情。

编辑:为了解决 Jon 的帖子,问题的原因(如 MS Connect 网站上所解释的那样)是“XML 字段不更新,因为 Linq-to-SQL 不更新”不处理 XElement.Changed 事件”。

对于我的实现,有效的代码最终看起来像这样:

MyXElementProperty.SetElementValue("Author", author);

MyXElementProperty = new XElement(MyXElementProperty);

供引用(给发现此问题的任何其他人),以下内容也有效:

MyXElementProperty = new XElement(MyXElementProperty);

MyXElementProperty.SetElementValue("Author", author);

最佳答案

当您将其设为新的 XElement 时,您正在制作一个不同的对象。有可能使用引用相等性来检测“陈旧性”,这显然会将其视为新值。

您实际上是在什么时候对元素进行更改?我期望 LINQ to SQL 具有原始值的缓存副本,然后将其与新值进行比较。如果它只是通过复制引用来获取“缓存副本”,那么无论您对该对象做什么,它都会始终认为两者是相等的。相反,如果您创建一个 元素,然后更改那个,那么旧对象仍将具有旧值,因此比较将了解您已经进行了更改。这有意义吗?

关于c# - Linq-to-SQL With XML Database Fields——为什么这行得通?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689772/

相关文章:

c# - 自动将一个对象的属性值应用到另一个相同类型的对象?

c# - 未选择为此解决方案配置构建的项目

c# - = 对比 : in argument of method call

c# - 如何让 T4MVC 重新生成 .generated.cs 文件?

asp.net - 如何在 IIS 7 中更新 FX_schema.xml 文件?

vb.net - 使用 linq to sql provider 在 VB.Net 中编写 Lambda 查询表达式

C# 从多个线程更新 TextBox

php - 使用命名空间前缀更新 XML 文件

c# - 在 XML 中存储文件名的正确方法是什么?

asp.net - 如何在ASP.NET MVC 2中为Html.EditorForModel()方法获取textarea