实体框架核心无法确定关系

3
我有两个对象:用户和关系。每个用户在我的系统中都会创建一个用户对象,根据他们添加的朋友数量,将为每个用户创建多个关系。这些对象如下所示。
public class User : IdentityUser {}

public class Relationship {
   // User who created the relationship
   public User User {get;set;}

   // User who the creation user is friends with
   public User Friend {get;set;}

   // Enum of Status (Approved, Pending, Denied, Blocked)
   public RelationshipStatus RelationshipStatus {get;set;}

   public DateTime RelationshipCreationDate {get;set;}
}

每个用户可能有多条记录与Relationship.User匹配,也可能有多条记录与Relationship.Friend匹配。在OnModelCreating方法中,我已经按照以下方式设置了我的DbContext:
protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Relationship>(relationship =>
    {
        relationship.HasOne(r => r.User).WithMany(u => u.Friends);                
    });            
}

我对Entity不太熟悉,所以这可能很简单——我错过了什么,才能按照我描述的设置关系?谢谢!

编辑:更具体地说,这是我得到的错误:

InvalidOperationException: 无法确定导航属性“User”的关系表示方式。“Relationship.Friend”类型。请手动配置关系,或使用“[NotMapped]”属性或在“OnModelCreating”中使用“EntityTypeBuilder.Ignore”忽略此属性

编辑2:重新思考我的过程后,我采取了不同的方法,并使用关系来包括追随者和追随者,而不是一个集体的朋友列表(这样更符合我的业务模型)。我使用以下方式实现了这一点:

public class User : IdentityUser {
  [InverseProperty("Friend")]
  public List<Relationship> Followers {get;set;}

  [InverseProperty("User")]
  public List<Relationship> Following {get;set;}
}

我很好奇除了我的解决方案以外,还有没有其他人能够提供原问题的解决方案,不过目前这个方案可以使用并且似乎最适合我。


这里有一个很好的参考资料:https://learn.microsoft.com/en-us/ef/core/modeling/relationships。请注意,在“博客”示例中,“博客”和“帖子”之间的一对多关系是这样表示的:`public List<Post> Posts { get; set; }`。 - paulsm4
1
@paulsm4 那篇帖子解决了我的问题。我采用了与最初不同的方法。我现在会立即更新问题,包括新的方法。 - Phillip McMullen
很酷 - 很高兴听到这个好消息!谢谢你回帖分享你的解决方案 - 这将有助于其他人 :) - paulsm4
2个回答

1

您尝试过在User类中添加关系列表吗,即

   public class User : IdentityUser {
       List<Relationship> Relationships {get;set;}
   }

这可能有助于 EF 充分理解关系。

谢谢Michael,我刚试了一下,看起来它仍然没有完全理解这个关系。它知道用户有朋友(Relationship.User == User),但似乎并没有理解一个用户也可以与“Friend”列相关联。 - Phillip McMullen

0

看起来你正在尝试使用相同的实体配置多对多关系。为此,请按照以下方式编写你的UserRelationship模型类:

public class User : IdentityUser 
{
   public List<Relationship> UserFriends { get; set; }
   public List<Relationship> FriendUsers { get; set; }
}

public class Relationship {

   public string UserId {get; set;} // `UserId` type is string as you are using default identity
   public User User {get;set;}

   public string FriendId {get; set;}
   public User Friend {get;set;}

   // Enum of Status (Approved, Pending, Denied, Blocked)
   public RelationshipStatus RelationshipStatus {get;set;}

   public DateTime RelationshipCreationDate {get;set;}
}

然后在模型构建器实体配置中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Relationship>().HasKey(r => new {r.UserId, r.FriendId});

    modelBuilder.Entity<Relationship>()
    .HasOne(r => r.User)
    .WithMany(u => u.UserFriends)
    .HasForeignKey(r => r.UserId).OnDelete(DeleteBehavior.Restrict);

    modelBuilder.Entity<Relationship>()
    .HasOne(r => r.Friend)
    .WithMany(f => f.FriendUsers)
    .HasForeignKey(r => r.FriendId).OnDelete(DeleteBehavior.Restrict);
}

现在应该可以正常工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接