Как предотвратить вставку дублирующихся данных с помощью nHibernate? - PullRequest
1 голос
/ 23 апреля 2009

Я создаю систему блогов / 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 работает с магией, которая изменяет свойства параметра, даже если он не передается как выходной параметр. Может кто-нибудь сказать мне, что здесь радует и как исправить этот метод, чтобы делать то, что я хочу? Я пытаюсь избежать использования ключевого слова out в параметре tag.

    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 Ответ

1 голос
/ 23 апреля 2009

Я не думаю, что ваша ссылка на 'out параметр' имеет смысл. Объект все тот же экземпляр, но NH обновил идентификатор до сгенерированного при сохранении.

Я думаю, вам нужно сначала получить тег, как вы делаете в своем примере. Если вы хотите, чтобы вызывающий абонент видел правильный идентификатор, сделайте

tag.id = existingTag.id;

Я думаю, что ваш вопрос относится к параметрам и способам их обработки, а не к NHibernate. Прочитайте эту статью , чтобы получить хорошее представление о том, как работает этот материал.

...