类型’System.ObjectDisposedException’的exception
我有以下EF代码的第一个代码。 它工作正常。 但当我寻找’club2.Members’的价值时,它会说:
‘club2.Members’抛出了’System.ObjectDisposedException’类型的exception。
消息是:
ObjectContext实例已被释放,不能再用于需要连接的操作。
我没有为Members属性设置值。 没关系。 但是它不应该在内部引起任何exception。
- 有没有办法克服这个例外?
- 删除此exception是否有助于提高性能?
- 为什么此exception不会导致程序执行终止?
注意:我不需要俱乐部实体中的会员数据(在我打电话的时候)。 即使当时没有成员加入俱乐部。 我只需要摆脱exception; 不使用预先加载来加载数据。 如何避免exception ?
namespace LijosEF { public class Person { public int PersonId { get; set; } public string PersonName { get; set; } public virtual ICollection Clubs { get; set; } } public class Club { public int ClubId { get; set; } public string ClubName { get; set; } public virtual ICollection Members { get; set; } } //System.Data.Entity.DbContext is from EntityFramework.dll public class NerdDinners : System.Data.Entity.DbContext { public NerdDinners(string connString): base(connString) { } protected override void OnModelCreating(DbModelBuilder modelbuilder) { //Fluent API - Plural Removal modelbuilder.Conventions.Remove(); } public DbSet Persons { get; set; } public DbSet Clubs { get; set; } } } static void Main(string[] args) { Database.SetInitializer(new MyInitializer()); CreateClubs(); CreatePersons(); } public static void CreateClubs() { string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; using (var db = new NerdDinners(connectionstring)) { Club club1 = new Club(); club1.ClubName = "club1"; Club club2 = new Club(); club2.ClubName = "club2"; Club club3 = new Club(); club3.ClubName = "club3"; db.Clubs.Add(club1); db.Clubs.Add(club2); db.Clubs.Add(club3); int recordsAffected = db.SaveChanges(); } } public static Club GetClubs(string clubName) { string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; using (var db = new NerdDinners(connectionstring)) { var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName); return query; } } public static void CreatePersons() { string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; using (var db = new NerdDinners(connectionstring)) { Club club1 = GetClubs("club1"); Club club2 = GetClubs("club2"); Club club3 = GetClubs("club3"); //More code to be added (using db) to add person to context and save } }
您收到此错误是因为在执行查询后正在处理dbcontext。 如果要使用“成员”中的数据,请使用查询加载它: http : //blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature- CTP5部分-6加载相关-entities.aspx
如果您不需要延迟加载,这意味着只加载您在查询中加载的数据(这将消除exception),请设置LazyLoadingEnabled = false。 请看这里: 默认情况下在Entity Framework 4中禁用延迟加载
方法1
不需要以下方法。 这可以在目前的背景下完成。 这只是一个选择。
GetClubs("club1");
方法2
附加实体解决了问题:
Club club1 = GetClubs("club1"); Club club2 = GetClubs("club2"); Club club3 = GetClubs("club3"); ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club1); ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club2); ((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)club3); var test = club2.Members;
我不应该试图引用club2.Members(俱乐部类),因为创建Person对象不需要它。
会员是俱乐部课程的相关数据。 由于它是虚拟的,它将进行延迟加载。
在不同的场景中,如果我必须从不同的上下文中检索Members对象(这是一个相关数据),我应该依赖于急切加载(在为您提供Club对象的位置)。
请参阅以下内容:
-
entity framework:多对多关系中的重复记录
-
System.ObjectDisposedException:ObjectContext实例已被释放,不能再用于需要连接的操作
-
ObjectContext实例已被释放,不能再用于需要连接的操作
-
绑定时已释放ObjectContext实例