XXX实例的标识符由Ÿ改变到z [英] identifier of an instance of xxx was altered from y to z

查看:204
本文介绍了XXX实例的标识符由Ÿ改变到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆