我有一个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