2010-04-12 14 views
9

Otrzymuję następujący błąd podczas próby zaktualizowania obiektu w bazie danych. Czy ktoś ma pojęcie, co może się wydarzyć? Sprawdziłem wszystkie moje typy danych i odpowiadają one zawartości bazy danych. Dzięki za wszelkie myśli -Identyfikator instancji xxx został zmieniony z y na z

NHibernate.HibernateException was unhandled by user code 
    Message="identifier of an instance of DataTransfer.status was altered from 3 to 4" 
    Source="NHibernate" 
    StackTrace: 
     at NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(Object obj, IEntityPersister persister, Object id, EntityMode entityMode) 
     at NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues(Object entity, EntityEntry entry, EntityMode entityMode, Boolean mightBeDirty, ISessionImplementor session) 
     at NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent event) 
     at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent event) 
     at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event) 
     at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) 
     at NHibernate.Impl.SessionImpl.Flush() 
     at NHibernate.Transaction.AdoTransaction.Commit() 
     at DataAccessLayer.NHibernateDataProvider.UpdateItem_temp(items_temp item_temp) in C:\Documents and Settings\Carl.PAMB\My Documents\Visual Studio 2008\Projects\InventoryDataClean\DataAccessLayer\NHibernateDataProvider.cs:line 226 
     at InventoryDataClean.Controllers.ImportController.Edit(Int32 id, FormCollection formValues) in C:\Documents and Settings\Carl.PAMB\My Documents\Visual Studio 2008\Projects\InventoryDataClean\InventoryDataClean\Controllers\ImportController.cs:line 101 
     at lambda_method(ExecutionScope , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

Z mojego dziennika log4net -

13:37:17 [9] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener - object already associated with session: [DataTransfer.items_temp#56876] 

Również tutaj jest, gdzie to się nazywa -

item.status.id = Int32.Parse(formValues["Status"]); 
_provider.UpdateItem_temp(item); 

A oto kod z mojego dostawcy danych.

public void UpdateItem_temp(items_temp item_temp) 
{ 
    ITransaction t = _session.BeginTransaction(); 
    try 
    { 
     _session.SaveOrUpdate(item_temp); 
     t.Commit(); 
    } 
    catch (Exception) 
    { 
     t.Rollback(); 
     throw; 
    } 
    finally 
    { 
     t.Dispose(); 
    } 
} 

Odpowiedz

6

To zdecydowanie źle:

item.status.id = Int32.Parse(formValues["Status"]); 

Zmieniasz ID instancji stanu, co jest niezgodne z prawem.

Zamiast tego, jeśli próbujesz zmienić stan elementu, należy to robić:

item.status = session.Load<Status>(Int32.Parse(formValues["Status"])); 

(domyśliłem „status” jako typ nieruchomości statusu; zastąpić go prawidłową nazwą)

+0

+1 za pierwszą część. Tak naprawdę nie wiemy o drugiej części, ponieważ nie zostały opublikowane żadne definicje obiektów danych, ale to w dużej mierze nie ma związku z problemem. –

+0

To bilet - działał idealnie. Dziękujemy – czuroski

+0

+1. Szkoda, że ​​nie znalazłem tego wcześniej. –

Powiązane problemy