如何判断Linq对象是否已附加到数据上下文?

时间:2009-12-21 15:24:28

标签: c# linq linq-to-sql

使用Linq-to-Sql:

MyClass obj;
...
// need to delete this object
dataContext.GetTable(obj.GetType()).DeleteOnSubmit(obj);

BUT

我不知道obj是否已附加到数据上下文。如果没有,最后一次调用DeleteOnSubmit会抛出异常。

必须有一种简单的方法来判断obj是否附加到dataContext - 但我看不到任何明显的事情。

你是怎么做到的?

3 个答案:

答案 0 :(得分:4)

虽然您可能想看一下您的设计,但由于这类事情应该是您可以确定性地确定的事情,所以可以这样做。

不幸的是,确定对象是否已附加的确切调用(或者,在L2S的内部命名法中,“已跟踪”)要求您调用Context.Services.ChangeTracker.GetTrackedObject,即internal。我能看到的最接近的事情是调用Table.GetOriginalEntityState,传入相关实体。如果返回值为null,则对象未跟踪(未附加)。如果返回值为非null,则跟踪(附加)对象。

请注意,我实际上没有对此进行过测试,但查看Reflector中的代码会让我觉得这应该适合您。

答案 1 :(得分:0)

Link2SQL,我猜?这应该从您的代码中显而易见。您真的需要在运行时动态查询状态吗? 只有从dataContext中获取obj才会附加obj。

我问similar question a while ago。也许Robert Harvey的评论对你有帮助。

答案 2 :(得分:0)

通过查看PropertyChanging和PropertyChanged事件,可以判断对象是否附加到数据上下文的一种方法。

我的实体上有一个方法可以按如下方式分离它们:


public virtual void Detach()
{
   PropertyChanging = null;
   PropertyChanged = null;
} 

因此,如果这两个属性不为null,则附加对象。

兰迪