两个表之间的几个一对多关系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; }
}
我有来宾实体
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
.
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; }
}