C#实体框架ObjectContext实例已被释放
当我想要在列表上迭代时,我得到以下错误C#实体框架ObjectContext实例已被释放,c#,entity-framework,C#,Entity Framework,当我想要在列表上迭代时,我得到以下错误 The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 我用以下代码打开表单 private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) {
The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
我用以下代码打开表单
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
int id = int.Parse(dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
}
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
frm.ShowDialog();
}
这是我表单的构造函数,这里我的应用程序抛出了上面的错误
public Aufenthaltsform(Gast g, Aufenthalt a)
{
InitializeComponent();
MessageBox.Show(a.Mitreisende.Count.ToString());
}
这就是奥芬顿的目标
public class Aufenthalt
{
public int AufenthaltID { get; set; }
public DateTime Anreisedatum { get; set; }
public DateTime Abreisedatum { get; set; }
public virtual List<Mitreisender> Mitreisende { get; set; }
public virtual Gast Gast { get; set; }
public Aufenthalt()
{
Mitreisende = new List<Mitreisender>();
}
}
公共类
{
public int AufenthaltID{get;set;}
公共日期时间Anreisedatum{get;set;}
公共日期时间Abreisedatum{get;set;}
公共虚拟列表mitreSende{get;set;}
公共虚拟Gast{get;set;}
公共行政管理局()
{
MitreSende=新列表();
}
}
您的Aufenthalt
有两个导航属性-Mitreisende
和Gast
。当您使用延迟加载时,需要非处置的DbContext
。这就是为什么在通过使用
语句处理上下文后尝试读取这些属性时出错的原因:
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
}
// db is disposed here
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
你可以:
- 使用语句删除
,以保持上下文处于活动状态
- 使用即时加载而不是延迟加载
- 使用语句在
内部移动表单创建和显示
- 获取MitreSende计数并将数字传递到表单中,而不是稍后传递根对象和使用导航属性
DbContext
是一个轻量级对象,可以不处理它
var db = new GastContext();
Aufenthalt a = db.Aufenthalte.First(x => x.AufenthaltID == id);
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
第二个选项-不是很好的选项,因为您只需要相关实体的计数。为什么要将它们全部载入内存?但是你可以
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
}
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
第三种选择是显而易见的
using (var db = new GastContext())
{
Aufenthalt a = db.Aufenthalte.First(x => x.AufenthaltID == id);
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
frm.ShowDialog();
}
最好的选择是不传递表单数据,因为表单数据不是必需的。它只需要计算Mitreisende的数量,而不是整个集合。所以把你的表格改成
public Aufenthaltsform(Gast g, int mitreisendeCount)
{
InitializeComponent();
MessageBox.Show(mitreisendeCount.ToString());
}
这么说吧
int mitreisendeCount;
using (var db = new GastContext())
{
mitreisendeCount = db.Aufenthalte.First(x => x.AufenthaltID == id).Mitreisende.Count;
}
Aufenthaltsform frm = new Aufenthaltsform(currentGast, mitreisendeCount );
您的
Aufenthalt
有两个导航属性-Mitreisende
和Gast
。当您使用延迟加载时,需要非处置的DbContext
。这就是为什么在通过使用
语句处理上下文后尝试读取这些属性时出错的原因:
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
}
// db is disposed here
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
你可以:
- 使用语句删除
,以保持上下文处于活动状态
- 使用即时加载而不是延迟加载
- 使用语句在
内部移动表单创建和显示
- 获取MitreSende计数并将数字传递到表单中,而不是稍后传递根对象和使用导航属性
DbContext
是一个轻量级对象,可以不处理它
var db = new GastContext();
Aufenthalt a = db.Aufenthalte.First(x => x.AufenthaltID == id);
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
第二个选项-不是很好的选项,因为您只需要相关实体的计数。为什么要将它们全部载入内存?但是你可以
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
}
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
第三种选择是显而易见的
using (var db = new GastContext())
{
Aufenthalt a = db.Aufenthalte.First(x => x.AufenthaltID == id);
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
frm.ShowDialog();
}
最好的选择是不传递表单数据,因为表单数据不是必需的。它只需要计算Mitreisende的数量,而不是整个集合。所以把你的表格改成
public Aufenthaltsform(Gast g, int mitreisendeCount)
{
InitializeComponent();
MessageBox.Show(mitreisendeCount.ToString());
}
这么说吧
int mitreisendeCount;
using (var db = new GastContext())
{
mitreisendeCount = db.Aufenthalte.First(x => x.AufenthaltID == id).Mitreisende.Count;
}
Aufenthaltsform frm = new Aufenthaltsform(currentGast, mitreisendeCount );
您应该确保在释放上下文之前执行查询:
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
// place this within the disposable context (using)
int count = a.Mitreisende.Count;
您应该确保在释放上下文之前执行查询:
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
// place this within the disposable context (using)
int count = a.Mitreisende.Count;
对象
a
本身在加载后被填充,但它有一个导航属性mitreSende
,该属性当时还没有被填充(实体框架还记得它还没有这样做)
在调用a.mitreisend.Count
时,Entity Framework尝试填充mitreisend属性,但它无法这样做,因为using
语句导致DbContext被释放,从而导致错误
有多个修复程序:
1) 不要简单地通过使用块删除来处理DbContext。NET将在稍后自行删除它,这在许多情况下不会造成伤害
2) 自己处理DbContext,但稍后再处理,将接下来的两行放在块中,而不是放在块后面
3) 确保实体框架使用语句尽快加载mitreSende
,而不是延迟加载。Include
语句:
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
}
// db is disposed here
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
对象a
本身在加载后被填充,但它有一个导航属性mitreSende
,该属性当时还没有被填充(实体框架还记得它还没有这样做)
在调用a.mitreisend.Count
时,Entity Framework尝试填充mitreisend属性,但它无法这样做,因为using
语句导致DbContext被释放,从而导致错误
有多个修复程序:
1) 不要简单地通过使用
块删除来处理DbContext。NET将在稍后自行删除它,这在许多情况下不会造成伤害
2) 自己处理DbContext,但稍后再处理,将接下来的两行放在块中,而不是放在块后面
3) 确保实体框架使用语句尽快加载mitreSende
,而不是延迟加载。Include
语句:
Aufenthalt a;
using (var db = new GastContext())
{
a = db.Aufenthalte.First(x => x.AufenthaltID == id);
}
// db is disposed here
Aufenthaltsform frm = new Aufenthaltsform(currentGast, a);
a = db.Aufenthalte.Include(x => x.Mitreisende).First(x => x.AufenthaltID == id);
或者使用。包括或者使用。包括看一看这个,对为什么会发生这种情况有一点理论性。看一看这个,对为什么会发生这种情况有一点理论性