两个表之间的几个一对多关系实体框架6

时间:2018-02-06 14:00:04

标签: c# entity-framework one-to-many one-to-one

我有访客实体

public class Guest
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
    }

我需要一个实体来描述两个客人之间的relationshipType。我想出了

public class RelationshipGuestLink
    {
        public Guid Id { get; set; }
        public Relationship Relationship { get; set; }
        public Guid RelationshipId { get; set; }
        public Guest FirstGuest { get; set; }
        public Guid FirstGuestId { get; set; }
        public Guest SecondGuest { get; set; }
        public Guid SecondGuestId { get; set; }
        public ProfileRelationshipType RelationshipType { get; set; }
        public Guid RelationshipTypeId { get; set; }
    }

使用fluentApi

映射它们
public RelationshipGuestLinkConfiguration()
    {
        ToTable("MyTable");
        HasKey(x => x.Id);
        HasOptional(x => x.Relationship).WithMany().HasForeignKey(x => x.RelationshipId);
        HasOptional(x => x.FirstGuest).WithMany().HasForeignKey(x => x.FirstGuestId);
        HasOptional(x => x.SecondGuest).WithMany().HasForeignKey(x => x.SecondGuestId);
        HasOptional(x => x.RelationshipType).WithMany().HasForeignKey(x => x.RelationshipTypeId);
    }

问题是,我不知道如何处理WithMany()部分。我是否必须在ICollection<RelationshipGuestLink>课程中创建两个Guest?或者我可以将它们映射到一个集合吗?

最后,我需要创建像家人一样的东西,并且能够从一个家庭成员中访问家庭成员。

编辑:感谢Vidmantas Blazevicius的帮助。 我将RelationshipType移到了Relationship类,因为它属于那里。没有它感到空虚和无用。还将我的第一和第二位客人更名为更合适的地方。

我的问题在于我的狂热是从问题的两个方面写下具有fluentApi的模型中的每个链接。我将这些链接视为外键,并且由于我的RelationshipGuestLink表有Guest表的两个键,我尝试在EF中创建两个链接。

但我仍然认为一个链接只会让我第一个访客的亲戚。为了得到他的整个家庭,我将不得不编写额外的代码来走这棵树并创建一个List<Guest>

1 个答案:

答案 0 :(得分:0)

我想我明白你要完成的是什么,单ICollection<RelationshipGuestLink>就足够了。通过这样做,您可以使用加入表RelationshipGuestLink获得1:M。

    public class Guest
    {
        public Guid Id { get; set; }

        public string Name { get; set; }

        public string Surname { get; set; }

        public virtual ICollection<RelationshipGuestLink> RelationshipLinks { get; set; }
    }

因此,如果示例是Child,Father和Mother - 都是Guest类的实例 - 那么您将拥有Child(父亲和母亲)的两个关系链接,每个父母一个(彼此相关)

修改

以下是我想象您的模型构建器正在寻找RelationshipGuestLink的方法。它应该就这么简单。就外键Guest而言,此表与GuestId表之间存在M:1关系。 RelatedGuest也是如此。你的Relationship财产实际上只是一端。虽然它与Relationship表的M:1关系 - 你真的不想在你的Relationship`实体类上有ICollection<RelationshipGuestLink>因为,但你确实希望外键存在。是否要在删除时级联(在大多数情况下这是非常可取的) - 这取决于您。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RelationshipGuestLink>()
            .HasKey(x => x.Id);

        modelBuilder.Entity<RelationshipGuestLink>()
                .HasRequired(x => x.Guest).WithMany(x => x.RelationshipLinks).HasForeignKey(x => x.Guest);

        modelBuilder.Entity<RelationshipGuestLink>()
            .HasRequired(x => x.Relationship).WithRequiredDependent();

    }

    public class RelationshipGuestLink
    {
        public Guid Id { get; set; }
        public Guid GuestId { get; set; }
        public Guid RelationshipId { get; set; }
        public Guid RelatedGuestId { get; set; }

        public Guest Guest { get; set; }
        public Relationship Relationship { get; set; }
        public Guest RelatedGuest { get; set; }

    }