我刚刚开始使用Linq,目前我已经准备好了一个数据库,并在c#中制作了一些实体类。
现在我的对象"Person"one_answers"Profession "有一个多对多的关系。但是每当我尝试调用下一个语句时,它都不会工作:
Context ctx = new Context(ConfigurationManager.ConnectionStrings["myContext"].ConnectionString);
var Julian = (from j in ctx.persons
where j.Name == "Julian"
select j).Single();
Profession proftest = new Profession() { Name = "Programmer", Accepted = true };
Julian.Professesions.Add(proftest);
ctx.SubmitChanges();
现在我将向您展示我正在使用的类:
Person得到了接下来的几个东西(类变量的其余部分有效,所以我将向您展示不好的部分):
// Data (for mapping)
private EntitySet<PersonProfession> personProfession;
public Person()
{
personProfession = new EntitySet<PersonProfession>();
}
[Association(Name = "FK_j_Person_Profession_Person", Storage = "personProfession", OtherKey = "personId", ThisKey = "Id")]
internal ICollection<PersonProfession> PersonProfessions
{
get { return personProfession; }
set { personProfession.Assign(value); }
}
public ICollection<Profession> Professions
{
get { return (from prof in PersonProfessions where prof.Profession.Accepted==true select prof.Profession).ToList(); }
}
现在我能够成功地调用"Person"类中的以下方法:
public void AddProfession(Profession profession, Person person)
{
PersonProfession pp = new PersonProfession();
pp.Person = person;
pp.Profession = profession;
personProfession.Add(pp);
}
但这当然不是我想要的。
数据关系如下:
Person -> j_Person_Profession <——Profession
我也遇到了同样的问题(. add()不起作用)与Person和Alias之间的另一个关系(这是一个表,只有一个PersonId的int和一个别名的字符串)。
最后一个小问题如下:我的"Profession"类也有与"Person"相同的链接,所以每当我询问一个人的上下文时,我可以查看他/她的职业,并且在职业中有更多具有相同职业的人。对于大型数据库来说,这不是很慢吗?也许我应该去掉反向链接?
从Yakimych的评论中,我得到了我的答案:
你正在使用的是Linq-to-SQL,不是吗?毫无疑问,L2S将连接表映射为实体,因此您必须像在工作示例中那样使用PersonProfession
对象。在实体框架与L2S相反的情况下,纯连接表(只包含两个外键)不会映射到单独的实体,您可以直接访问Person.Professions
和Professions.People
。