Я работал с NHibernate, используя Fluent NHibernate для сопоставления. Я решил много проблем и начал думать, как опытный в 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)
Генератор Id - генератор идентификаторов с автоматическим инкрементом, управляемый базой данных. (не hilo или любой другой). Версия NHibernate - 3.2.0.
Я попытался перегрузить Equals и GetHashCode, не повезло.
Шаблон UnitOfWork, который я использую, требует не совершать транзакции или сеанса флеша внутри цикла foreach. NHibernate говорит, что есть еще один объект с тем же идентификатором, но все, что я делаю, это вставка нового объекта, который вообще не имеет идентификатора.
Я использую ту же структуру по всему моему проекту, и она хорошо работает везде, кроме этого. Я подозрюю, что это может быть из-за свойства Content, которое является текстом и установлено в большую строку.
Что мне здесь не хватает? Или у NHibernate что-то не хватает?
В вашем сопоставлении у вас есть ClassMap ', но показывая класс' Message' - это опечатка? –
Rippo
Да, на самом деле это «MessageNew». Спасибо за предупреждение, я отредактировал сообщение. – SadullahCeran
Вы когда-нибудь это понимаете? – BueKoW