如何在实体框架中定义用户对用户关系的模型?

本文关键字:用户 关系 模型 定义 实体 框架 | 更新日期: 2023-09-27 18:15:00

通常在EF中可以使用

ApplicationUser User { get; set; }

来定义与属性的用户关系。但我有点困惑如何处理两个用户之间的属性,明白吗?基本上,我想为用户之间的关系定义一个模型,例如

UserA和UserB的关系如下:

bool Friends { get; set; }
bool Blocked { get; set; }

我也想知道如何最好地为这个"Blocked"属性建模。因为我希望两者都能互相阻挡并解除阻挡。例如,UserA阻塞UserB。然后他决定解除阻塞,因此Blocked属性从true变为false。但是如果UserB也阻塞了UserA,该属性仍然为真。

28/07

编辑

public class ApplicationUser : IdentityUser
{
         ...
         public virtual ICollection<UserRelationships> Relationships { get; set; }
}
 public class UserRelationships
    {
        public int UserRelationshipsId { get; set; }
        public UserRelationships() { this.Friends = false; this.Blocked = false; }
        public List<ApplicationUser> Users { get; set; }
        public bool Friends { get; set; }
        public bool Blocked { get; set; }
        public string Blocker { get; set; }
        public string SecondBlocker { get; set; }
    }

如何在实体框架中定义用户对用户关系的模型?

您可以在EF中执行多对多(纯连接),但它只跟踪左和右ID,没有其他。因此,如果您想审计友谊或块的时间,则必须在另一个表中执行此操作。

相反,我建议您使用以下结构:

public class ApplicationUserRelationship
{
    public virtual ApplicationUser LeftUser { get; set; }
    public virtual ApplicationUser RightUser { get; set; }
    public virtual RelationshipType RelationshipType { get; set; }
    public virtual DateTime? CreatedDateTime { get; set; }
    public virtual DateTime? UpdatedDateTime { get; set; }
    ...
}

如果有意义,您当然可以将RelationshipType替换为string或一组bool (IsFriend, IsBlocked)或enum

在你的ApplicationUser你现在有:

public virtual ICollection<ApplicationUserRelationship> ApplicationUserRelationships { get; set; }

然后在fluent中:

modelBuilder.Entity<ApplicationUser>()
             .HasMany(u => u.ApplicationUserRelationships)
             .WithRequired(u => u.LeftUser);
modelBuilder.Entity<ApplicationUser>()
             .HasMany(u => u.ApplicationUserRelationships)
             .WithRequired(u => u.RightUser);