我的数据库有两个表:
Users
UserId PK
Likes
LikeId PK
LikedUserId FK
LikingUserId FK
这些表代表用户的“喜欢”。点赞是有向的——用户A喜欢用户B,但用户B不喜欢用户A。
我像这样使用 NHibernate 进行映射:
<class name="User" table="Users">
<id name="UserId">
<generator class="assigned"></generator>
</id>
<idbag name="LikedBy" table="Likes" inverse="true">
<collection-id column="LikeId" type="guid">
<generator class="guid.comb"/>
</collection-id>
<key column="LikedUserId"/>
<many-to-many column="LikingUserId" class="User"/>
</idbag>
<idbag name="Liking" table="Likes">
<collection-id column="LikeId" type="guid">
<generator class="guid.comb"/>
</collection-id>
<key column="LikingUserId"/>
<many-to-many column="LikedUserId" class="User"/>
</idbag>
</class>
对应这个类:
public class User
{
public Guid UserId { get; set; }
public ICollection<User> LikedBy { get; set; }
public ICollection<User> Liking { get; set; }
}
这很好用。但是,两个不同用户的 Liking
和 LikedBy
集合可能会不同步。例如:
using (var session = new NHibHelp.OpenSession())
{
var user1 = session.GetById<User>(id1);
var user2 = session.GetById<User>(id2);
int initialCount = user2.LikedBy.Count();
user1.Liking.Add(user2);
session.Update(user1);
int finalCount = user2.LikedBy.Count();
Assert.AreEqual(initalCount,finalCount); // passes
}
因此,如果我添加到一个用户的 LikedBy
集合,则不会更新另一个用户的 LikedBy
集合。要更新它,我需要执行 Session.Refresh()
。
这并不理想。我是 NHibernate 的新手,所以我不知道是否还有其他解决方案 - 我能做些什么更好的事情吗?例如,是否有可能以 LikedBy
在适当的时候自动更新的方式映射此场景?
最佳答案
您可以向 User
类添加一个同步两个集合的方法:
public class User
{
public Guid UserId { get; set; }
public ICollection<User> LikedBy { get; set; }
public ICollection<User> Liking { get; set; }
public void Like(User user)
{
this.Liking.Add(user);
user.LikedBy.Add(this);
}
}
您也可以将此集合设置为对外部代码只读:
private ICollection<User> likedBy;
private ICollection<User> liking;
public IEnumerable<User> LikedBy { get { return this.likedBy; } }
public IEnumerable<User> Liking { get { return this.liking; } }
<idbag access="field.camelcase" ... />
关于c# - 自动更新 NHibernate 中的相应集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12724422/