我刚刚开始使用Linq,目前我已准备好数据库并在C#中创建了一些实体类。
现在我的名为“人”的对象与“职业”有多对多的关系。但每当我试着打出下一个声明时,它都行不通:
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();
现在我将向您展示我正在使用的课程:
人得到了接下来的几件事(其余的类变量都有效,所以我会告诉你不好的部分):
// 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);
}
但当然不是我想要的。
数据关系如下:
人 - &gt; j_Person_Profession&lt; - 专业
我也遇到了同样的问题(.Add()不会工作)与Person和Alias之间的另一个关系(这是一个只有一个用于PersonId的int和一个用于别名的String的表。
最后一个小问题如下: 我的“职业”课程也与“人”有相同的联系,所以每当我询问一个人的背景时,我都可以看看他/她的职业,在这个职业中,有更多的人具有相同的职业。对于大型数据库,这不是很慢吗?也许我应该删除后向链接?
答案 0 :(得分:2)
从Yakimych's comment,我得到了答案:
你使用的是Linq-to-SQL,不是吗? AFAIK,L2S将联结表映射为实体,因此您必须像在工作示例中一样使用
PersonProfession
对象。如果实体框架与L2S相反,纯联结表(仅包含两个外键)将不会映射到单独的实体,您可以直接访问Person.Professions
和Professions.People
。