c# - 自动更新 NHibernate 中的相应集合?

标签 c# nhibernate nhibernate-mapping

我的数据库有两个表:

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; }
}

这很好用。但是,两个不同用户的 LikingLikedBy 集合可能会不同步。例如:

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/

相关文章:

nhibernate - 如果什么也没找到,为什么 Session.Load<User>(id) 不返回 null?

sql - 你可以在 MySql 中使用自动增量而不是它是主键吗

c# - NHibernate 手动控制抓取

nhibernate - 多对多集合中的 Nhibernate 和 Fluent Nhibernate 的内连接或右外连接

nhibernate - IPreUpdateEventListener 和动态更新 ="true"

c# - 如何从本地计算机生成 bacpac 文件并将其上传到 Azure blob 上?

c# - 无法解析 DNS(有时?)

c# - ASP.NET 使用 SqlConnection 连接 MySQL

c# - 我如何使用 Fluent NHibernate 来区分父关系的列

c# - FlatBuffers KeyValuePair 数据类型和模式定义