与三元协会合作

时间:2009-10-27 13:23:37

标签: nhibernate

我有一个班级:

class User
{
    IDictionary<Post, DateTime> SavedPosts { get; set; }
}

将其保存到多对多表关联[用户] - &lt; [保存]&gt; - [发布]

[保存]表:

ID_USER (int)
ID_POST (int)
SAVED_ON (DateTime)

映射看起来像这样:

<map name="SavedPosts" table="[SAVES]">
  <key column="ID_USER" />
  <index-many-to-many column="ID_POST" class="Post" />
  <element column="SAVED_ON" />
</map>

如果我这样做:

 User u = db.Get<User>(1); //get user with ID = 1
 Post p = db.Load<Post>(5); //load post with ID = 5

 //Let's say I know that the post #5 is saved
 DateTime savedon = u.SavedPosts[p];

Nhibernate执行:

 SELECT ID_USER, SAVED_ON, ID_POST FROM [SAVES] WHERE ID_USER = 1

但是......如果用户有10万个已保存的帖子??!?!我不想把它全部拿走。

所以我可以这样做:

 db.CreateQuery(@"select s
                    from User u
                    join u.SavedPosts s
                   where u.ID = :userId
                     and s.index = :postId")
   .SetInt32("userId", u.ID)
   .SetInt32("postId", p.ID)
   .UniqueResult<DateTime>();

它运作正常。

但是如何更新或插入SavedPosts?每次当我在IDictionary SavedPosts上“做某事”时,它都会从数据库中加载所有数据(查看上面的SQL语句)。

“做某事”意味着:

u.SavedPosts[p] = DateTime.Now; //for update
u.SavedPosts.Add(p, DateTime.Now); //for insert

所以我满意的结果是:

  • 数据库中的一个命中,从SAVES表中获取一个没有记录,
  • 如果我收到记录,那么我会更新它,
  • 如果我没有得到记录,我会插入。

我该怎么做?

0 个答案:

没有答案