5

Przed kopać mój komputer do przyszłego tygodnia ...NHibernate.AssertionFailure: null identyfikator

Mam wyrejestrowany każdą inną pytanie o to, ale żaden z nich nie ma rozwiązania. Usunąłem ten kod z powrotem, ale nadal nie działa.

dostaję ten błąd podczas zapisywania obiektu: NHibernate.AssertionFailure: null identyfikator

To jest mój plik mapowania:

public class OrderMap : BaseMap<Order> 
{ 
    public SalesOrderMap() 
    { 
     Id(x => x.Id).Column("OrderId"); 
    } 
} 

Jest to jednostka:

public class Order 
{ 
    public virtual int Id { get; protected set; } 
} 

To jest mój kod testowy:

Order order = new Order(); 
ISession session = SessionFactory.GetCurrentSession(); 
session.SaveOrUpdate(order); <----EXCEPTION ON THIS LINE 
session.Flush(); 

A potem huk ... to zrywa z

[AssertionFailure: null identifier] 
    NHibernate.Engine.EntityKey..ctor(Object identifier, String rootEntityName, String entityName, IType identifierType, Boolean batchLoadable, ISessionFactoryImplementor factory, EntityMode entityMode) +135 
    NHibernate.Engine.EntityKey..ctor(Object id, IEntityPersister persister, EntityMode entityMode) +70 
    NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +545 
    NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +322 
    NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) +130 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) +27 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) +63 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) +89 
    NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) +188 
    NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) +259 
    NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj) +256 

jeśli ktoś jest zainteresowany, to jest jak fabryka sesja jest zbudowany:

ControllerSource.SessionFactory = Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2008.ConnectionString(DataConfig.ConnectionString)) 
       .Mappings(x => x.FluentMappings.Add(typeof (OrderMap))) 
       .ExposeConfiguration(c =>{ 
              c.SetProperty("generate_statistics", "false"); 
              c.SetProperty("current_session_context_class", contextClass); 
              c.SetProperty("cache.use_second_level_cache", "false"); 
              c.SetProperty("cache.use_query_cache", "false"); 
              c.SetProperty("connection.release_mode", "on_close"); 
       }) 
       .BuildSessionFactory(); 
+0

Czy możesz opublikować skrypt tworzenia dla tabeli zamówień? – twaggs

+0

Obecnie jest to tylko tabela z polem, auto increment, int, not nullable – Paul

+0

(Myślę, że byłem trochę pillock ........) – Paul

Odpowiedz

1

Trzeba albo przypisać swoją entitity id podczas próby aby utworzyć nowy lub określić sposób jego generowania w pliku odwzorowania. Zmienić mapowanie do:

Id(x => x.Id).Column("OrderId").GeneratedBy.Identity(); 
+0

Wierzę, że "Tożsamość" jest wartością domyślną dla tej wartości ... niestety to nie zadziałało – Paul

+0

@Paul - usuń "chroniony" z zestawu w obiekcie porządkowym – Justin

15

domyślnego generatora jest rodzimy, który z kolei wykorzystania tożsamości dla SQL Server 2008. Mój zakład jest to, że nie masz tożsamości określony na kolumny w definicji tabeli.

+3

To poprawne wyjaśnienie. Ktoś powinien zaakceptować to jako odpowiedź. – Tobias

2

Sprawdź, czy tabela nie ma wyzwalacza, który zakłóca INSERT, a może wywołuje procedurę przechowywaną we wkładce.

Gdy NHibernate wstawia encję, zapyta bazę danych o automatycznie wygenerowany klucz podstawowy nowej encji.

INSERT INTO [Order] (MyProperty) VALUES (@p0); select SCOPE_IDENTITY() 

Zanotuj SCOPE_IDENTITY select() wezwanie.

Jeśli SCOPE_IDENTITY zwróci wartość NULL, otrzymasz wyjątek NHIbernate.AsersertFailure: null.

Jako przykład, wyzwalacz "ZAMAWIAĆ WSTAW" spowoduje, że SCOPE_IDENTITY zwróci wartość null i wyzwoli aserię NHibernate.

Jeśli znajdziesz zakłócenie wyzwalacza, możesz rozwiązać ten problem, tymczasowo go wyłączając. Na dłuższą metę możesz zdecydować, czy całkowicie usunąć wyzwalacz, jeśli nie jest już potrzebny.

Alternatywnie można zawijać wkładkę w transakcji; następnie wyłącz wyzwalacz przed wstawieniem, wykonaj faktyczne zapisanie/wstawienie obiektu, a następnie ponownie włącz wyzwalacz i zatwierdz transakcję.

+1

Możesz być pomocny, nawet gdy nie jesteś w biurze David! – Dmihawk

Powiązane problemy