如何防止使用nHibernate插入重复数据?

时间:2009-04-22 21:05:26

标签: nhibernate unique

我正在构建一个博客/ CMS系统(为了好玩,我知道我可以使用它。) 我有一个简单的Tag实体,只有Id(int)和TagName(字符串)属性。我想配置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);

我设想保存(标签)做类似查找的事情,如果标签已经存在,以某种方式用tag1的值替换tag2。 nHibernate运行一些修改参数属性的魔法,即使它没有作为out参数传递。有人能告诉我这里有什么好处以及如何解决方法来做我想做的事情?我试图避免在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
        }
    }

1 个答案:

答案 0 :(得分:1)

我不认为你对'out参数'的引用是有道理的。该对象仍然是同一个实例,但NH在保存时已将ID更新为生成的ID。

我认为您必须首先获取标签,就像您在示例中所做的那样。如果您希望呼叫者看到正确的ID

tag.id = existingTag.id;

我认为您的问题与参数及其处理方式有关,而与NHibernate无关。阅读this article以获得有关这些内容如何运作的良好基础。