在Linq To Sql中将字段标记为脏

时间:2011-01-19 01:42:32

标签: c# .net linq-to-sql

我的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知道字段已经改变的一般方法。

3 个答案:

答案 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;