Pracowałem z NHibernate, używając Fluent NHibernate do mapowania. Rozwiązałem wiele problemów i zacząłem myśleć, że jestem doświadczony w nhibernate. Jednak ten błąd jest dość dziwny.NHibernate, inny obiekt o tej samej wartości identyfikatora był już powiązany z sesją
To jest mój model:
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; }
}
A mój mapowanie
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);
}
}
Tu, gdzie występuje wyjątek:
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
}
}
prosimy o wyjątek:
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)
Generator identyfikatorów to generator id z automatyczną inkrementacją baz danych. (nie hilo ani żadna inna). Wersja NHibernate to 3.2.0.
Próbowałem przeciążać Equals i GetHashCode, bez powodzenia.
Wzorzec UnitOfWork, którego używam, nie wymaga zatwierdzania transakcji ani sesji przepłukiwania w pętli foreach. NHibernate mówi, że istnieje inny obiekt o tym samym id, ale wszystko, co robię, to wstawianie nowego obiektu, który w ogóle nie ma żadnego identyfikatora.
Używam tej samej struktury w całym moim projekcie i działa dobrze wszędzie, ale to. Podejrzewam, że może to wynikać z właściwości "Treść", która jest tekstem i jest ustawiona na duży ciąg.
Czego tu mi brakuje? Lub NHibernate czegoś brakuje?
W twoim mapowaniu masz 'ClassMap', ale pokazanie klasy 'Wiadomość' jest literówką? –
Rippo
Tak, w rzeczywistości jest to "MessageNew". Dzięki za ostrzeżenie, zredagowałem post. – SadullahCeran
kiedykolwiek to rozgryzłeś? – BueKoW