NHibernate, другой объект с тем же значением идентификатора уже был связан с сеансом - PullRequest
9 голосов
/ 13 марта 2012

Я работал с NHibernate, используя Fluent NHibernate для отображения. Я решил много вопросов и начал думать, что я опытный в nhibernate. Однако эта ошибка довольно странная.

Это моя модель:

    public class MessageNew
    {
        public virtual int Id { get; set; }
        public virtual string Content { get; set; }
        public virtual string Subject { get; set; }
        public virtual User User { get; set; }
        public virtual bool IsSent { get; set; }
        public virtual string AmazonMessageId { get; set; }
    }

И мое отображение

public class MessageNewMap : ClassMap<MessageNew>
{
    public MessageNewMap()
    {
        Id(x => x.Id);
        Map(x => x.Content).CustomSqlType("text");
        Map(x => x.Subject);
        Map(x => x.AmazonMessageId);
        Map(x => x.IsSent);

        References(x => x.User);
    }
}

Здесь, где возникает исключение:

foreach (var userToSend in usersToSend)
{
    string body = MailHelper.BuildSomeBody()
    if (userToSend  != CurrentUser)
    {
        MessageNew message = new MessageNew
        {
            User = userToSend,
            IsSent = false,
            Content = body,
            Subject = subject
        };
        session.Save(message); // Exception thrown
    }
}

Сведения об исключении:

NHibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 1779, of entity: Models.MessageNew
   at NHibernate.Engine.StatefulPersistenceContext.CheckUniqueness(EntityKey key, Object obj)
   at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
   at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
   at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
   at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
   at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
   at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
   at NHibernate.Impl.SessionImpl.Save(Object obj)

Генератор идентификаторов - это генератор идентификаторов с автоматическим приращением. (не хило или любой другой). Версия NHibernate - 3.2.0.

Я попытался перегрузить Equals и GetHashCode, не повезло.

Используемый мной шаблон UnitOfWork не требует фиксации транзакции или сброса сеанса внутри цикла foreach. NHibernate говорит, что есть другой объект с таким же идентификатором, но все, что я делаю, это вставляю новый объект, у которого вообще нет идентификатора.

Я использую одну и ту же структуру во всем проекте, и она хорошо работает везде, кроме этого. Я подозреваю, что это может быть связано со свойством «Content», которое является текстом и имеет большую строку.

Что мне здесь не хватает? Или в NHibernate чего-то не хватает?

Ответы [ 11 ]

0 голосов
/ 13 марта 2012

Это исключение обычно означает, что у вас есть 2 отдельных экземпляра объекта с одинаковым значением идентификатора, которым вы пытаетесь управлять в одном сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...