Linq DataContext - 它在课堂上的位置?

时间:2013-01-28 19:17:44

标签: asp.net linq

我还是LINQ的新手,并且在知道将DataContext放在Class中的位置时遇到了一些问题。

这是我尝试过的:

public class Student
{
    private static LinqClassesDataContext db = new LinqClassesDataContext();
    public static Profile GetProfile(int uID)
    {
        var profile = (from p in db.Profiles
                        where p.uID == uID
                        select p).FirstOrDefault();
        return profile;
    }
}

但是我遇到了结果缓存问题(?) - 请看这个问题:Weird caching issue with ASP.net/Linq

然后,我尝试将DataContext放在类中的每个方法中:

public class Student 
{
    public static Profile GetProfile(int uID)
    {
        using (LinqClassesDataContext db = new LinqClassesDataContext())
        {
            var profile = (from p in db.Profiles
                           where p.uID == uID
                           select p).FirstOrDefault();
            return profile;
        }
     }
}

但是我的应用程序中出现“在Dispose之后访问DataContext”错误。

所以,我见过这种方式的另一种方式就是这样:

public class Student 
{
    public static Profile GetProfile(int uID)
    {
        LinqClassesDataContext db = new LinqClassesDataContext();
        {
            var profile = (from p in db.Profiles
                           where p.uID == uID
                           select p).FirstOrDefault();
            return profile;
        }
     }
}

但似乎这不是最有效的方式。也许我错误地使用了Linq(我是一个自学成才的ASP.net'er),但有人可以告诉我什么是最好的前进方式?

1 个答案:

答案 0 :(得分:1)

对象附加到上下文中,因此一旦你处理它,如果你试图导航它的关系,你会得到这些类型的错误,就像你选择#2一样。

由于ASP.NET是无状态的,因此您需要在每次需要时加载配置文件对象,而不是静态缓存对象,或者使用LINQ to SQL的DataLoadOptions对象加载对象及其所有相关数据({ {3}})。这样,访问相关数据集时就不需要上下文。

至于放置它的位置,我总是把它放在HttpContext.Current.Items集合中,它可以存储每个请求的实例,然后在所有请求中从这里共享它。我包装了一些代码,所以我的应用程序不知道它是从这里得到它。但是,您必须要小心,因为如果ASP.NET外部的进程使用相同的代码,则此方法会因为没有HTTP上下文而爆炸。在这种情况下,每次都要实例化上下文。