DataContext在更新外键字段之前处理

时间:2011-01-26 19:55:47

标签: c# .net linq-to-sql foreign-keys datacontext

我使用linq to sql为asp.net c#web应用程序的DataContexts遇到了一些问题。

我首先遇到抛出异常的问题,因为我没有处理DataContext,与this question中的错误相同。我使用的是静态DataContext,这可能是为什么它没有被正确处理掉,在阅读this和其他几篇文章之后,我将所有调用包含在使用语句中以确保它们将被处理掉。

但是,现在当我需要更新外键时,我遇到了问题,因为DataContext已经被处理掉了。我不确定为什么它已经被处理掉了,在这种情况下最好的做法是什么,所以任何想法都会受到高度赞赏!

这里的简短例子:

更新:我认为我的例子太令人困惑了,当我试图让它尽可能短时,所以这里有一个更长的希望更好的例子:

private static void SendTexts(List<TextAlert> TextQueue)
{
    using (THTDataContext db = new THTDataContext())
    {
        foreach (TextAlert text in TextQueue)
        {
            try
            {
                // do IntelliSMS stuff

                // set status to 'sent'
                text.Status = 1;

                db.SubmitChanges();
            }
            catch (IntelliSMSException ex)
            {
                // set status to 'failed'
                text.Status = 2;

                db.SubmitChanges();
            }
        }
    }
}

谢谢,

Annelie

2 个答案:

答案 0 :(得分:3)

糟糕!如果在尝试更新数据库中的条目时抛出异常,您是否真的认为在异常处理程序中尝试更新数据库中的条目是个好主意?

至于这里发生了什么,thing的来源是什么?它来自在另一个MyDataContext实例上执行的查询吗?如果是这样,那就是你的问题。

答案 1 :(得分:3)

您可能需要将传入的MyThing附加到新的上下文中。这样的事情可能有用:

private static void DoMyStuff(MyThing thing)
{
    using (MyDataContext db = new MyDataContext())
    {
       db.MyThings.Attach(thing);
       thing.Status = 1;
       db.SubmitChanges();
    }
}

一旦附加,上下文应该能够跟踪对它的更改,并在提交时存储它们。

如果这不能解决“已经处置”的异常,那么您可以在处置旧上下文之前尝试"detaching" MyThing。请注意,如果必须使用此路由,则DataContext的生命周期可能不正确,因为实体不是设计为在同一应用程序域中的上下文之间移动。

如果您有兴趣更好地理解附加/分离业务,MSDN的Dinesh Kulkarni有一个short blog post