XXX实例的标识符由Ÿ改变到z [英] identifier of an instance of xxx was altered from y to z
问题描述
我试图更新一个数据库对象时,收到以下错误。没有人有任何想法可能发生?我检查了我所有的数据类型和它们对应的是在数据库中。感谢您的任何想法 -
NHibernate.HibernateException是由用户代码
消息=DataTransfer的一个实例标识符未处理
在NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(obj对象,IEntityPersister的持留,对象ID,entityMode entityMode:.STATUS从3至4
来源=NHibernate的
堆栈跟踪改变)
在NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues(对象实体,EntityEntry项,entityMode entityMode,布尔mightBeDirty,ISessionImplementor会话)
在NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件)
。在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent事件)
在NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent事件)
在NHibernate.Event.Default.DefaultFlushEventListener.OnFlush( FlushEvent事件)
在NHibernate.Impl.SessionImpl.Flush()
在NHibernate.Transaction.AdoTransaction.Commit()
在DataAccessLayer.NHibernateDataProvider.UpdateItem_temp(items_temp item_temp)在C:\文件和Settings\Carl.PAMB\My Documents\Visual工作室2008\Projects\InventoryDataClean\DataAccessLayer\NHibernateDataProvider.cs:行226
在InventoryDataClean.Controllers.ImportController.Edit(的Int32 ID,的FormCollection formValues)在C:\Documents和Settings\Carl.PAMB\My Documents\Visual工作室2008\Projects\InventoryDataClean\InventoryDataClean\Controllers\ImportController.cs:行101
。在lambda_method(ExecutionScope,ControllerBase,对象[])
在System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,对象[]参数)在System.Web.Mvc.ReflectedActionDescriptor.Execute
(ControllerContext controllerContext ,IDictionary`2参数)
在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2参数)LT
在System.Web.Mvc.ControllerActionInvoker&;> c__DisplayClassa < InvokeActionMethodWithFilters> b__7()
在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func`1续)
的InnerException:
从我的log4net的日志 -
13: 37:17 [9] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener - 对象已与会话相关:[DataTransfer.items_temp#56876]
此外,这里是它被称为 -
item.status.id = Int32.Parse( formValues [状态]);
_provider.UpdateItem_temp(项目);
这是从我的数据提供者的代码。
公共无效UpdateItem_temp(items_temp item_temp)
{
ITransaction T = _session.BeginTransaction();
试
{
_session.SaveOrUpdate(item_temp);
t.Commit();
}
赶上(例外)
{
t.Rollback();
抛出;
}
终于
{
t.Dispose();
}
}
这肯定是不对的:
item.status.id = Int32.Parse(formValues [状态]);
您正在改变状态的实例,这是违法的ID。
相反,如果你想更改的项目状态,你应该这样做:
item.status = session.Load<状态>(Int32.Parse(formValues [状态));
(我猜状态作为状态属性的类型;具有正确的名称替换)
I am getting the following error when trying to update an object in a db. Does anyone have any idea what might be happening? I have checked all my datatypes and they correspond to what is in the db. Thanks for any thoughts -
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:
From my log4net log -
13:37:17 [9] DEBUG NHibernate.Event.Default.DefaultSaveOrUpdateEventListener - object already associated with session: [DataTransfer.items_temp#56876]
Also, here is where it is called -
item.status.id = Int32.Parse(formValues["Status"]);
_provider.UpdateItem_temp(item);
And here is the code from my data provider.
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();
}
}
This is definitely wrong:
item.status.id = Int32.Parse(formValues["Status"]);
You are changing the Id of a status instance, which is illegal.
Instead, if you are trying to change the item status, you should be doing this:
item.status = session.Load<Status>(Int32.Parse(formValues["Status"]));
(I guessed "Status" as the type of the status property; replace it with the correct name)
这篇关于XXX实例的标识符由Ÿ改变到z的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!