gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:08:41 25 4
gpt4 key购买 nike

一些背景:我有一个数据库,我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com