两个表之间的几个一对多关系Entity Framework 6

Several one to many relationships between two tables Entity Framework 6

我有来宾实体

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

我需要一个描述两位客人之间关系类型的实体。我想到了

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() 部分。我必须在 Guest class 中创建两个 ICollection<RelationshipGuestLink> 吗?或者我可以将它们映射到一个集合吗?

最后我需要创建类似家庭的东西,并且能够从家庭的任何成员访问家庭成员。

编辑:感谢 Vidmantas Blazevicius 的帮助。 我将 RelationshipType 移动到 Relationship class,因为它属于那里。没有它就会感到空虚和无用。还将我的第一位和第二位客人重命名为更合适的名称。

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

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

我想我明白你想要完成什么,一个 ICollection<RelationshipGuestLink> 应该就足够了。通过这样做,您可以通过加入 table 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,父亲和母亲 - 都是来宾 class 的实例 - 你将有两个 Child 的关系链接(到父亲和母亲),一人一人parent(彼此相关)。

编辑:

下面是我想象中的模型构建器如何寻找 RelationshipGuestLink。它应该就这么简单。就外键 GuestId 而言,从 table 到 Guest table 存在 M:1 关系。 RelatedGuest 也一样。您的 Relationship 属性 实际上只会在一端。虽然它也 M:1 与 Relationship table 的关系 - 你真的不想在你的关系实体 class 上有 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; }

    }