我的LinqToSql模型中的一个实体有一个XElement类型的字段,映射到SQL Server中的XML列。
当我执行以下操作时:
myEntity.MyXmlField.Add(new XAttribute("attribute", "value"));
...
DataContext.SubmitChanges();
该字段未在数据库中更新(但其他字段也是如此)。 我认为DataContext无法跟踪在XElement中进行的更改,因此该字段未标记为脏并且不会更新。
这是正确的假设吗?我该如何解决?
修改
阅读Scrum Meister提供的链接后,看起来像
myEntity.MyXmlField = new XElement(myEntity.MyXmlField);
将解决问题。
然而,这个解决方案非常特定于XElement(因为它很容易克隆它),并且如果XElement很大,则涉及大量处理。
必须有一种让DataContext知道字段已经改变的一般方法。
答案 0 :(得分:2)
好吧,看起来这是一个众所周知的问题: http://connect.microsoft.com/VisualStudio/feedback/details/360433/linq-to-sql-xml-fields-dont-update
微软的建议是使用
myEntity.MyXmlField = new XElement(myEntity.MyXmlField);
所以我认为没有更好或一般的方法来解决这个问题。
答案 1 :(得分:2)
您可以使用反射来掌握Linq-to-SQL的内部更改跟踪器。不漂亮,但除非您的应用程序以有限的信任运行,否则它会起作用。有关示例,请参阅以下主题:
What's the cleanest way to make a Linq object "dirty"?
Can you convince a DataContext to treat a column as always dirty?
答案 2 :(得分:1)
这里的问题是更改XML列的值并不会将其标记为“已更改” - 引用不会更改,因此映射器不知道它已更改。
答案非常简单:
var field = new XElement(myEntity.MyXmlField);
field.Add(new XAttribute("attribute", "value"));
myEntity.MyXmlField = field;