繁体   English   中英

两个表之间的一对多关系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; }
    }

我需要一个描述两个客人之间的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()部分。 是否必须在Guest类中创建两个ICollection<RelationshipGuestLink> 还是可以将它们映射到一个集合?

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

编辑:感谢Vidmantas Blazevicius的帮助。 我将RelationshipType移到Relationship类,因为它属于该类。 没有它,就会感到空虚无用。 也将我的第一和第二位客人改名为更合适的名字。

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

但是我仍然认为一个链接只会让我成为第一位客人的亲戚。 为了得到他的全家人,我将不得不编写其他代码来遍历这棵树并创建一个List<Guest>

我想我了解您要完成的工作,并且一个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; }
    }

因此,如果示例是“孩子”,“父亲”和“母亲”(都是Guest类的实例),则您将有两个“孩子”(到父亲和母亲)关系链接,每个父关系(彼此相互关联)链接。

编辑:

下面是我想象您的模型构建者正在寻找RelationshipGuestLink 它应该就是那样简单。 就外键GuestId而言,此表与Guest表之间存在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; }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM