C# - Linq很多与联结表

时间:2011-05-05 09:35:51

标签: c# linq many-to-many one-to-many

我刚刚开始使用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的表。


最后一个小问题如下: 我的“职业”课程也与“人”有相同的联系,所以每当我询问一个人的背景时,我都可以看看他/她的职业,在这个职业中,有更多的人具有相同的职业。对于大型数据库,这不是很慢吗?也许我应该删除后向链接?

1 个答案:

答案 0 :(得分:2)

Yakimych's comment,我得到了答案:

  

你使用的是Linq-to-SQL,不是吗? AFAIK,L2S将联结表映射为实体,因此您必须像在工作示例中一样使用PersonProfession对象。如果实体框架与L2S相反,纯联结表(仅包含两个外键)将不会映射到单独的实体,您可以直接访问Person.ProfessionsProfessions.People