gpt4 book ai didi

c# - LINQ to SQL -> 无法访问已释放的对象。对象名称 : 'DataContext accessed after Dispose

转载 作者:行者123 更新时间:2023-11-30 14:47:14 25 4
gpt4 key购买 nike

假设我有 2 个表,分别是学生表和学校表。在我的学生表中,我有一个链接到学校记录的 fkSchoolId。但是,如果我按如下方式检索我的记录

public static List<Student> GetByType(string connString, int type)
{
using (mydb_DataContext db = new mydb_dbDataContext(connString))
{
return (from t1 in db.Students
where t1.type = type
select t1).ToList();
}
}

我将拥有 Student 对象的列表,我可以在 foreach 循环中访问它。但是当我按照下面的方式操作时,在检索学校名称时会出错。

foreach(Student student in DAL.StudentLogic.GetByType(5))
{
string schoolName = student.School.Name;
}

System.ObjectDisposedException: 'Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.'.'

请问如何获取存储在返回对象中的外部信息,以便我可以访问它们?或者更好的方法,如果我可以指定只加载学校名称?

更新:如果我按照以下操作,它会起作用,但不确定它会对性能产生多大影响。我将在下周再次对此主题进行基准测试和更新。

public static List<Student> GetByType(string connString, int type)
{
using (mydb_DataContext db = new mydb_dbDataContext(connString))
{
List<Student> students = (from t1 in db.Students where t1.type = type select t1).ToList();

foreach(Student student in students)
{
student.School.Name = db.Schools.Where(q => q.SchoolId == student.fkSchoolId).FirstOrDefault().Name;
}
}
}

我将能够在我的返回对象中访问 student.School.Name。

最佳答案

设置DeferredLoadingEnabled属性为 false:

Gets or sets a value that indicates whether to delay-load one-to-many or one-to-one relationships.

因此,相关数据将在具体化查询时检索,而不是在稍后阶段检索(在处理上下文之后)

public static List<Student> GetByType(string connString, int type)
{
using (mydb_DataContext db = new mydb_dbDataContext(connString))
{
db.DeferredLoadingEnabled = false;
return (from t1 in db.Students
where t1.type = type
select t1).ToList();
}
}

但是,请考虑(取决于总体设计/程序要求和负载)让上下文在该函数所在的类(看起来像 DAL 类)的生命周期内保持打开状态。然后实现 IDisposable 接口(interface)并在其中处理上下文。 (请记住,必须显式调用 Dispose)。


如果您只需要学校名称并且您使用的是 C# 7.0,则可以使用 named tuples这样:

public static List<(Student Student, string SchoolName)> GetByType(string connString, int type)
{
using (mydb_DataContext db = new mydb_dbDataContext(connString))
{
return (from t1 in db.Students
join school in db.Schoold on t1.SchoolId equals school.Id
where t1.type = type
select (t1, school.Name)).ToList();
}
}

如果你得到 compilation error CS8137然后需要安装System.ValueTuple

的Nuget包

关于c# - LINQ to SQL -> 无法访问已释放的对象。对象名称 : 'DataContext accessed after Dispose,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46130064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com