我仍然是 LINQ 的新手,在知道将 DataContext 放在类中的哪个位置时遇到了一些问题。
这是我尝试过的:
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;
}
}
但是我遇到了结果缓存(?)的问题 - 请参阅此问题: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;
}
}
}
但是后来我在应用程序中收到"在处置后访问的数据上下文"错误。
所以,我看到的唯一另一种方法是这样的:
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),但是有人可以启发我前进的最佳方式吗?
对象附加到上下文中,因此一旦您释放它,如果您尝试导航它的关系,您将获得这些类型的错误,就像您在选项 #2 中遇到的那样。
由于 ASP.NET 是无状态的,因此您需要在每次需要时加载配置文件对象,而不是静态缓存该对象,或者使用 LINQ to SQL 的 DataLoadOptions 对象加载对象及其所有相关数据(请参阅此处)。 这样,在访问相关数据集时就不需要上下文。
至于放在哪里,我总是把它放在HttpContext.Current.Items
集合中,它可以存储每个请求的实例,然后从这里在所有请求中共享它。 我围绕它包装了一些代码,所以我的应用程序不知道它从这里获取它。 但是,您必须小心,因为如果 ASP.NET 之外的进程使用相同的代码,则此方法会因为没有 HTTP 上下文而失败。 在这种情况下,每次都实例化上下文。