EF Code First声明实体关系2个字段到同一个集合

时间:2013-10-30 02:50:27

标签: c# .net entity-framework ef-code-first

我正在使用Code First的Entity Framework。我的数据库中有一个表,用于存储用户之间的关系。表结构看起来很像这样:

  • RequestID
  • UserFromID
  • UserToID

UserFromIDUserToID都是我的User表的外键。

在我的用户实体中,我有一个名为Relationships的虚拟属性。我希望此属性是上面列出的表中所有RelationshipRequests的集合,其中当前用户UserIDUserFromIDUserToID

这些是我在上下文中的绑定:

modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.Relationships).WithRequired(e => e.UserFrom)
    .HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity<UserProfile>()
    .HasMany(e => e.Relationships).WithRequired(e => e.UserTo)
    .HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);

但是,一旦为用户检索了关系,集合中的唯一关系就是用户ID为UserToID的关系。我尝试过交换它们,在这种情况下,集合只包含用户ID为UserFromID的关系。似乎第二个绑定覆盖了第一个绑定而不是像我预期的那样附加到它。我显然做错了。我的问题是,是否有另一种方法来进行这种绑定,以便两个键都按照我想要的方式绑定,或者这是我必须以另一种方式实现的?

谢谢!

1 个答案:

答案 0 :(得分:0)

问题是你使用两次相同的属性,当然你的第二个绑定会覆盖第一个。您必须在用户模型上创建2个导航属性,每个外键一个

modelBuilder.Entity<UserProfile>()
.HasMany(e => e.FromRelationships).WithRequired(e => e.UserFrom)
.HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity<UserProfile>()
.HasMany(e => e.ToRelationships).WithRequired(e => e.UserTo)
.HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);

在模型上你会有类似的东西

public virtual List<Relationships> FromRelationships { get; set; }
public virtual List<Relationships> ToRelationships { get; set; }