C# EF6非键列上的多对多
我在EF6中首先使用代码连接多对多关系时遇到问题,然后再创建一个传递关联 有三个类:Person、Tag和Passing 每个人都有一个可选的围嘴 每个标签都有一个可选的围嘴,而不是唯一的 每次通过都有一个必需的TagId 我想通过获取具有相同Bib的所有标签,然后获取与每个标签相关联的所有通行证来访问链接到一个人的所有通行证 我曾尝试在DBContext类中使用DBModelBuilder,但无法使其正常工作,而EF6似乎试图以任何方式生成一个中间表,这似乎是不必要的C# EF6非键列上的多对多,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我在EF6中首先使用代码连接多对多关系时遇到问题,然后再创建一个传递关联 有三个类:Person、Tag和Passing 每个人都有一个可选的围嘴 每个标签都有一个可选的围嘴,而不是唯一的 每次通过都有一个必需的TagId 我想通过获取具有相同Bib的所有标签,然后获取与每个标签相关联的所有通行证来访问链接到一个人的所有通行证 我曾尝试在DBContext类中使用DBModelBuilder,但无法使其正常工作,而EF6似乎试图以任何方式生成一个中间表,这似乎是不必要的 public class
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; }
}
公共类人物
{
[关键]
公共int PersonId{get;set;}
...
公共字符串Bib{get;set;}
公共虚拟ICollection标记{get;set;}
公共虚拟ICollection通行证
}
公共类标签
{
[关键]
公共字符串TagId{get;set;}
公共字符串Bib{get;set;}
公共虚拟ICollection传递{get;set;}
公共虚拟人{get;set;}
}
公共课及格
{
[关键]
public int PassingId{get;set;}
...
公共字符串TagId{get;set;}
公共虚拟标记{get;set;}
}
当一个表中有一个*to*多重性时,它会自动创建另一个链接这些表的表,否则不能在其中一个表中放入无限数量和可变数量的foraign键实体框架用于表示数据库关系。如果不需要额外的表,那么这里没有数据库关系,因为不涉及键
您应该能够使用某种函数(或扩展函数)来获得您想要的:
IQueryable<Passing> PersonPassings(YourContext db, Person p)
{
return db.Passings.Where(pa => pa.Tag.Bib == p.Bib);
}
IQueryable PersonPassings(您的上下文数据库,Person p)
{
返回db.Passings.Where(pa=>pa.Tag.Bib==p.Bib);
}
另一方面,如果你想创建一个合适的关系,你需要一个中间的
Bibs
表来连接Person
和Tag
我在这里没有看到多对多关系。EF构建什么中间表?此外,我不明白为什么Bib
上的信息在这里是相关的。Bib是关联的来源。标记上的Person属性应获取具有相同bib(或null)的Person,而Person上的Passings属性应获取具有相同bib的标记列表。这可能是不可能的优雅与EF,但我希望它是这样,我不需要一个混乱的解决办法。