2010-04-12 61 views
9

尝试更新数据库中的对象时出现以下错误。有谁知道可能会发生什么?我检查了我所有的数据类型,它们对应于db中的内容。感谢您的任何想法 -xxx的实例的标识符从y更改为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: 

从我的log4net的日志 -

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

而且,这里是它被称为 -

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

这里是从我的数据提供程序的代码。

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(); 
    } 
} 

回答

6

这肯定是不对的:

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

要更改状态的实例,这是违法的ID。

相反,如果你想更改的项目状态,你应该这样做:

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

(我猜“状态”的状态属性的类型;具有正确的名称替换)

+0

第一部分为+1。我们并不真正了解第二部分,因为没有发布数据对象定义,但这在很大程度上与问题无关。 – 2010-04-12 18:27:14

+0

这是票 - 完美的工作。谢谢 – czuroski 2010-04-12 18:35:23

+0

+1。我希望我早点发现它。 – 2011-09-06 08:00:36

相关问题