私のデータベースには 2 つのテーブルがあります。
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; }
}
これはうまくいきます。ただし、2 人の異なるユーザーの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
}
したがって、Liking
あるユーザーのコレクションに追加すると、LikedBy
別のユーザーのコレクションは更新されません。更新するには、する必要がありますSession.Refresh()
。
これは理想的ではありません。私は NHibernate を初めて使用するので、別の解決策があるかどうかわかりません。他にできることはありますか? たとえば、LikedBy
適切なときに自動的に更新されるような方法でこのシナリオをマッピングすることは可能ですか?