C# EF代码首先向同一集合声明实体关系2个字段

C# EF代码首先向同一集合声明实体关系2个字段,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我首先使用实体框架和代码。我的数据库中有一个存储用户之间关系的表。表结构看起来很像这样: RequestID UserFromID UserToID UserFromID和UserToID都是我的用户表的外键 在我的用户实体中,我有一个名为Relationshipssetup的虚拟属性。我希望此属性是上表中所有RelationshipRequests的集合,其中当前用户UserID是UserFromID或UserToID 以下是我在上下文中的绑定: modelBuilder.Entity&l

我首先使用实体框架和代码。我的数据库中有一个存储用户之间关系的表。表结构看起来很像这样:

  • RequestID
  • UserFromID
  • UserToID
UserFromID
UserToID
都是我的用户表的外键

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

以下是我在上下文中的绑定:

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);
modelBuilder.Entity()
.HasMany(e=>e.Relationships).WithRequired(e=>e.UserFrom)
.HasForeignKey(e=>e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity()
.HasMany(e=>e.Relationships).WithRequired(e=>e.UserTo)
.HasForeignKey(e=>e.UserToID).WillCascadeOnDelete(true);
但是一旦为用户检索到关系,集合中唯一的关系就是用户ID为
UserToID
的关系。我尝试过交换它们,在这种情况下,集合只包含用户ID为
UserFromID
的关系。似乎第二个绑定覆盖了第一个绑定,而不是像我预期的那样附加到它。我显然做错了。我的问题是,是否有另一种方法来进行绑定,以便两个键都按照我想要的方式绑定,或者这是我必须以另一种方式实现的


谢谢

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

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);
modelBuilder.Entity()
.HasMany(e=>e.FromRelationships)。WithRequired(e=>e.UserFrom)
.HasForeignKey(e=>e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity()
.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; }
公共虚拟列表FromRelationships{get;set;}
关系{get;set;}的公共虚拟列表

对。我知道我能做到。但在控制器中,我需要它们是一个列表。我可以采用这种方法,让我的Relationships对象将它们作为一个集合返回,但是在保存实体时遇到了问题。我必须单独保存它们。我希望避免这种情况。我不认为这是可能的,如果我必须将两个列表id保持在一起,以便在db上添加类型字段(from/to)。为了将它们保持在一起,我最终要做的是使用单独的列表(从关系到关系)然后有一个只读属性“relationship”,返回两个列表的并集。这很好,如果我遇到类似的问题,我必须记住它!