如何与最新的EF Core夜间版本建立多对多的关系?

Pau*_*aul 26 entity-framework-core

如何使用Fluent API在EF7 EF Core中的两个表之间创建多对多的关系?例如,假设您有以下表格:

照片到人数据库图

如何利用DbContext类中的modelBuilder来定义这样的关系?

我已经看到EF团队关于这个主题的会议记录中的这个链接,但它是从去年开始,我想知道是否有关于如何在EF7 EF Core 中进行此处的新信息.

我能够在Photos和PhotosPeople以及People和PhotosPeople之间创建一对多的关系.数据库按照我的意愿生成,但人和照片之间的导航现在需要与中间实体进行交互.我想避免这种情况.

bri*_*lam 48

这由#1368跟踪.解决方法是将连接表映射到实体:

class Photo
{
    public int Id { get; set; }
    public ICollection<PersonPhoto> PersonPhotos{ get; set; }
}

class PersonPhoto
{
    public int PhotoId { get; set; }
    public Photo Photo { get; set; }

    public int PersonId { get; set; }
    public Person Person { get; set; }
}

class Person
{
    public int Id { get; set; }
    public ICollection<PersonPhoto> PersonPhotos{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请务必PersonPhoto使用复合键进行配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<PersonPhoto>().HasKey(x => new { x.PhotoId, x.PersonId });
}
Run Code Online (Sandbox Code Playgroud)

要导航,请使用选择:

// person.Photos
var photos = person.PersonPhotos.Select(c => c.Photo);
Run Code Online (Sandbox Code Playgroud)

  • @seanbun我相信这个方法被重命名为`HasKey`(匹配EF6) (7认同)
  • 因此,我在代码中的注释.使用`modelBuilder.Entity <PersonPhoto>()配置它.键(x => new {x.PhotoId,x.PersonId});` (3认同)
  • @bricelam,我在尝试这种方法时在Asp.Net 5遇到一些麻烦,跟着你的例子,显然如果我试图用她的照片返回一个人的JSON我没有得到任何回应,因为它属于永久的引用循环在Person和PersonPhotos集合之间,有什么方法可以解决这种情况? (2认同)