非键列上的EF6多对多

时间:2015-05-14 20:02:27

标签: c# entity-framework entity-framework-6

我在使用代码首先在EF6中连接多对多关系时遇到问题,然后在此之外创建一个传递关联。

有三个类:人物,标签和传递。

每个人都有一个可选的围兜。

每个标签都有一个可选的围兜,而不是唯一的。

每次传递都有一个必需的TagId。

我希望通过获取具有相同Bib的所有标签来访问链接到Person的所有Passings,然后将所有Passings与每个标签相关联。

我已尝试在我的DBContext类中使用DBModelBuilder,但无法使其正常工作,而且EF6似乎试图生成一个中间表,这似乎是不必要的。

public class Person
{
    [Key]
    public int PersonId { get; set; }
    ...
    public string Bib { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<Passing> Passings
}

public class Tag
{
    [Key]
    public string TagId { get; set; }
    public string Bib { get; set; }
    public virtual ICollection<Passing> Passings { get; set; }
    public virtual Person Person { get; set; }
}

public class Passing
{
    [Key]
    public int PassingId { get; set; }
    ...
    public string TagId { get; set; }
    public virtual Tag Tag { get; set; }
}

2 个答案:

答案 0 :(得分:1)

这是必要的,当你有一个*到*多样性进入一个表时,它会自动创建另一个链接这些表的表,否则你不能在你的一个表中放入无限和可变数量的foraign键

答案 1 :(得分:1)

实体框架使用navigation properties来表示数据库关系。如果您不想要一个额外的表,那么您所拥有的不是数据库关系,因为不涉及密钥。

你应该可以使用某种功能(或扩展功能)来获得你想要的东西:

IQueryable<Passing> PersonPassings(YourContext db, Person p)
{
    return db.Passings.Where(pa => pa.Tag.Bib == p.Bib);
}

另一方面,如果您想创建正确的关系,则需要一个中间Bibs表来连接PersonTag