我有以下EF代碼第一個代碼。它工作正常。但是,當我查看'club2.Members'的價值時,它會顯示以下內容:類型'System.ObjectDisposedException'的異常
'club2.Members'拋出了'System.ObjectDisposedException'類型的異常。
消息是:
的ObjectContext的實例已被設置,並且不再能夠用於需要連接的操作。
我沒有爲會員屬性設置值。沒關係。但是它不應該在內部造成任何異常。
- 有沒有辦法克服這個異常?
- 刪除此異常是否有助於提高性能?
- 爲什麼這個異常不會導致程序執行終止?
注意:我不需要俱樂部實體中的會員數據(在我打電話的地方)。即使當時沒有成員加入俱樂部。我需要的是擺脫例外;不要使用熱切加載來加載數據。如何避免異常?
namespace LijosEF
{
public class Person
{
public int PersonId { get; set; }
public string PersonName { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public string ClubName { get; set; }
public virtual ICollection<Person> 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<PluralizingTableNameConvention>();
}
public DbSet<Person> Persons { get; set; }
public DbSet<Club> Clubs { get; set; }
}
}
static void Main(string[] args)
{
Database.SetInitializer<NerdDinners>(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
}
}
我剛剛忽略了你的代碼。爲什麼在CheckValues中創建另一個數據庫實例? – 2012-07-26 07:35:50
@AmiramKorach我有另一種方法 - CreatePersons。我將不得不在那裏使用新的環境。我正在使用Context Per Request方法。人們需要了解俱樂部。 – Lijo 2012-07-26 08:05:27
這段代碼沒有意義。您在CreatePersons中根本不使用數據庫變量。每個GetClubs調用都使用自己的數據庫變量。 – 2012-07-26 08:12:33