【问题标题】:How to create a many to many relationship with latest nightly builds of EF Core?如何与最新的 EF Core 夜间版本建立多对多关系?
【发布时间】:2015-06-09 03:38:42
【问题描述】:

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

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

我在 EF 团队的会议记录中看到了有关此主题的 this 链接,但它是从去年开始的,我想知道在 EF7 EF 中是否有关于如何解决此问题的新信息核心。

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

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    这是由#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; }
    }
    

    请务必使用复合键配置PersonPhoto

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

    要导航,请使用 Select:

    // person.Photos
    var photos = person.PersonPhotos.Select(c => c.Photo);
    

    【讨论】:

    • 当我尝试运行迁移时,它说:Microsoft.Data.Entity.Metadata.ModelItemNotFoundException:实体类型“PersonPhoto”需要定义一个键。
    • 因此我在代码中的注释。使用modelBuilder.Entity&lt;PersonPhoto&gt;().Key(x =&gt; new { x.PhotoId, x.PersonId });配置它
    • 哦。伟大的。谢谢布里斯拉姆。抱歉没注意。谢谢。
    • @bricelam,在尝试这种方法时,我在 Asp.Net 5 中遇到了一些麻烦,按照你的例子,显然如果我尝试用她的照片返回一个人的 JSON,我没有得到回应,因为它陷入了 Person 和 PersonPhotos 集合之间的永久引用循环中,有什么办法可以解决这种情况?
    • @seanbun 我相信该方法已重命名为 HasKey(以匹配 EF6)
    猜你喜欢
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    相关资源
    最近更新 更多