我有一個Team table和一個Player表以多對多的關係。有一個名爲TeamOnPlayer的鏈接表。帶POCO的EF爲Team實體生成名爲Person的導航屬性,並生成導航。支柱。稱爲人民團體實體。將新記錄插入LINQ的鏈接表到POCO的實體
我試圖插入一個新的記錄到TeamOnPlayer表中,但EF和POCO隱藏它。我試着這樣做:
public static void AddPersonToTeam(int TeamId, int PersonId)
{
using (var ef = new korfballReportEntities())
{
var team = GetTeam(TeamId);
var person = GetPerson(PersonId);
team.Person.Add(person);
person.Team.Add(team);
ef.SaveChanges();
}
}
的GetTeam(TeamId)和GetPerson(PERSONID)得到正確的團隊和個人:
public static Team GetTeam(int id)
{
using (var ef = new korfballReportEntities())
{
var q = from l in ef.Team
where l.Id == id
select l;
return q.Single();
}
}
public static Person GetPerson(int id)
{
using (var ef = new korfballReportEntities())
{
var query = from p in ef.Person
where p.Id == id
select p;
return query.Single();
}
}
當它試圖調用team.Person.Add(人)它會拋出一個異常:
「ObjectContext實例已被處置,不能再用於需要連接的操作。」 System.Exception {System.ObjectDisposedException}
任何人都可以請給我看看正確的方法嗎?
編輯
現在我明白了什麼問題了,謝謝你。我對你包含的使用塊有點困惑。例如這樣的:
using (var ef = new korfballReportEntities())
{
//switch lazy loading off, only in this single context
ef.Configuration.LazyLoadingEnabled = false;
var repository = new MyRepository(ef);
repository.AddPersonToTeam(int TeamId, int PersonId);
}
我應該在哪裏放呢?
我做了別的事情。我只是做到了這一點,而且工作得很好。
public static void AddPersonToTeam(int TeamId, int PersonId)
{
using (var ef = new korfballReportEntities())
{
var q = from t in ef.Team
where t.Id == TeamId
select t;
var team = q.Single();
var q2 = from p in ef.Person
where p.Id == PersonId
select p;
var person = q2.Single();
try
{
team.Person.Add(person);
person.Team.Add(team);
}
catch (Exception e)
{
}
ef.SaveChanges();
}
}
唯一的問題是,我coludn't重用我GetPerson(INT ID)和GetTeam(INT ID)方法。
您認爲如何?好嗎?這是一個醜陋的方式?
您可以包含GetTeam和GetPerson的代碼嗎? –
當然可以。你可以在上面看到它。 – robessog