如果您愿意将解决方案稍微移出数据域,则您的用户可以与他们指定为朋友的其他用户建立一对多的关系。这可能是protected
或者private
如果您不希望它泄漏。
然后,您实现一个公共属性,该属性将实际友谊定义为需要双向关系。也许是这样的:
public List<User> Friends {
this.assignedFriends.Where(f => f.assignFriends.Contains(this)).ToList();
}
但是,如果您这样做,您将需要确保您使用的是二级缓存,否则对该属性的请求将影响您的数据库。
相反,如果您需要返回专用Friendship
对象的集合,则取决于您如何持久化这些条目以及如何映射该类。
一种选择是定义Friendship
为简单地将三列、一个主键和两个外键返回到User
表中。然后,每当有人尝试添加朋友时,您都需要一点逻辑:您首先需要检查一半的关系是否已经存在。
var f = session.Query<Friend>()
.Where(x => x.User1 == YourCurrentUser)
.Cacheable()
.FirstOrDefault();
然后如果它存在,你分配关系的另一半
f.User2 = TheOtherUser;
否则创建一个新对象:
f = new Friendship();
f.User1 = YourCurrentUser;
在任一分支之后:
session.SaveOrUpdate(f);
然后一个User
朋友就变成了
public property List<Friendship> {
session.Query<Friendship>()
.Where(f =>
f.User1 != null && f.User2 != null
&& (f.User1 == this || f.User2 == this)
).Cacheable()
.ToList();
}
请注意,我不在我的 VS 安装附近。请原谅拼写错误或者我犯了明显的错误(我现在是凌晨 2:30)