NHibernate, другой объект с тем же значением идентификатора уже был связан с сеансом.

Я работал с 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 говорит, что есть еще один объект с таким же идентификатором, но все, что я делаю, это вставляю новый объект, у которого вообще нет идентификатора.

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

Что я здесь упускаю? Или в NHibernate чего-то не хватает?

9
задан SadullahCeran 14 March 2012 в 09:27
поделиться