Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#实体框架ObjectContext实例已被释放_C#_Entity Framework - Fatal编程技术网

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);

或者使用。包括或者使用。包括看一看这个,对为什么会发生这种情况有一点理论性。看一看这个,对为什么会发生这种情况有一点理论性