如何在实体框架中定义用户对用户关系的模型?
本文关键字:用户 关系 模型 定义 实体 框架 | 更新日期: 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);