1

我正在构建一个博客/CMS 系统(为了好玩,我知道我可以使用很多东西)。
我有一个简单的 Tag 实体,它只有一个 Id (int) 和一个 TagName (string) 属性。我想配置 nHibernate 以便我可以执行以下操作:

var tag1 = Tag.CreateTag("duplicate tag test");  // Id=0 at this point
var tag2 = Tag.CreateTag("duplicate tag test");  // Id=0 at this point
TagRepository.Save(tag1);  // tag1.Id is non-zero
TagRepository.Save(tag2);  // tag2.Id should be the same as tag1.Id at this point, but it's not

Assert.AreEqual(tag1, tag2);

我设想 Save(Tag) 做一些类似查找的事情,如果标签已经存在,以某种方式将 tag2 替换为 tag1 的值。nHibernate 有一些魔法可以修改参数的属性,即使它没有作为输出参数传递。有人可以告诉我这里发生了什么以及如何解决这个方法来做我想做的事吗?我试图避免在 tag 参数上使用 out 关键字。

    public override void Save(Tag tag)
    {
        Tag existingTag = GetByTagName(tag.TagName);
        if (null == existingTag)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.SaveOrUpdate(tag);
                transaction.Commit();
            }
        }
        else
        {
            tag = existingTag; // obviously doesn't impact the caller
        }
    }
4

1 回答 1

1

我认为您对“输出参数”的引用没有意义。该对象仍然是同一个实例,但 NH 在保存时已将 ID 更新为生成的 ID。

我认为您只需要像您在示例中所做的那样首先获取标签。如果您希望呼叫者看到正确的 ID,请执行

tag.id = existingTag.id;

我认为您的问题与参数及其处理方式有关,而不是与 NHibernate 有关。阅读这篇文章以获得关于这些东西如何工作的良好基础。

于 2009-04-23T19:08:01.137 回答