Я работал с 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 чего-то не хватает?