我有访客实体
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>
答案 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; }
}