【问题标题】:identifier of an instance of xxx was altered from y to zxxx 实例的标识符从 y 更改为 z
【发布时间】:2015-01-20 20:55:17
【问题描述】:

尝试更新数据库中的对象时出现以下错误。有谁知道会发生什么?我检查了我所有的数据类型,它们对应于数据库中的内容。感谢您的任何想法 -

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

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    这绝对是错误的:

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

    您正在更改状态实例的 Id,这是非法的。

    相反,如果您尝试更改项目状态,您应该这样做:

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

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

    【讨论】:

    • +1 表示第一部分。我们真的不知道第二部分,因为没有发布数据对象定义,但这与问题基本无关。
    • 我在条件断点中做了类似item.id = 100 的操作,我花了一段时间才弄清楚为什么在代码没有任何变化时会引发异常:-( 谢谢。
    最近更新 更多