![](/img/trans.png)
[英]Entity Framework Code First creates classes from two tables and relationships one to many
[英]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.