C# xxx实例的标识符从y更改为z
尝试更新数据库中的对象时,我遇到以下错误。有人知道会发生什么吗?我已经检查了所有的数据类型,它们与数据库中的数据类型相对应。谢谢你的任何想法-C# xxx实例的标识符从y更改为z,c#,nhibernate,C#,Nhibernate,尝试更新数据库中的对象时,我遇到以下错误。有人知道会发生什么吗?我已经检查了所有的数据类型,它们与数据库中的数据类型相对应。谢谢你的任何想法- NHibernate.HibernateException was unhandled by user code Message="identifier of an instance of DataTransfer.status was altered from 3 to 4" Source="NHibernate" StackTrace:
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:
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();
}
}
此外,这里称之为-
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();
}
}
这是我的数据提供者提供的代码
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();
}
}
这绝对是错误的:
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();
}
}
item.status.id = Int32.Parse(formValues["Status"]);
您正在更改状态实例的Id,这是非法的
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();
}
}
相反,如果您试图更改项目状态,则应执行以下操作:
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();
}
}
item.status = session.Load<Status>(Int32.Parse(formValues["Status"]));
item.status=session.Load(Int32.Parse(formValues[“status”]);
(我猜“Status”是Status属性的类型;用正确的名称替换它)+1表示第一部分。我们不太了解第二部分,因为没有发布任何数据对象定义,但这与问题基本无关。我在条件断点中执行了类似于
item.id=100
的操作,花了一段时间才弄清楚为什么在代码中没有任何更改时会出现异常:-(谢谢)。
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();
}
}