【问题标题】:NHibernate : SqlDateTime Overflow When Deleting EntityNHibernate:删除实体时 SqlDateTime 溢出
【发布时间】:2011-05-16 17:41:12
【问题描述】:

我正在尝试删除一个对象,但收到一个 SqlTypeException : SqlDateTime 溢出。

所以,今天我激活了“显示 SQL” 配置中的属性, 令我惊讶的是,我发现当我尝试删除这个实体时 NHibernate 确实如此 更新女巫导致错误,因为我的 DataTime 属性有 无效值。 问题是为什么 NHibernate 之前尝试更新实体 删除操作? 这是我的代码:

  using (ITransaction tnx = presentationSession.BeginTransaction()) { 
                try { 
                    presentationSession.Delete(View.SelectedData); 
         /* View.SelectedData has the reference I want to delete. Entity Id: 4601 */
                    tnx.Commit(); 
                } catch { 
                    tnx.Rollback(); 
                    throw; 
                } 
            } 

这是我的映射:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default- 
lazy="false"> 
    <class 
                name="PTFS.Personal.Model.Empleado, PTFS.Personal" 
                table="Supervisores" 
                > 
        <id 
            name="Id" 
            unsaved-value="0" 
            access="field.camelcase" 
            > 
            <generator class="native" /> 
        </id> 
        <property name="Nombre" /> 
        <property name="Supervisor" /> 
        <property name="Cedula" /> 
        <property name="Cargo" /> 
        <property name="Localidad" /> 
        <property name="Traslado" column="DES_TRASLADO" /> 
        <property name="Cambio" column="DES_CAMBIO" /> 
        <property name="FechaTraslado" column="F_TRASLADO" /> 
        <property name="FechaCambio" column="F_CAMBIO" /> 
        <property name="Ingreso" column="F_INGRESO" /> 
        <property name="Egreso" column="F_EGRESO" /> 
        <property name="Sueldo" column="SUELDO_BRUTO" /> 
    </class> 
</hibernate-mapping>

这是我使用上述内容提交更改时得到的输出 代码:

NHibernate: UPDATE Supervisores SET Nombre = @p0, Supervisor = @p1, 
Cedula = @p2, Cargo = @p3, Localidad = @p4, DES_TRASLADO = @p5, 
DES_CAMBIO = @p6, F_TRASLADO = @p7, F_CAMBIO = @p8, F_INGRESO = @p9, 
F_EGRESO = @p10, SUELDO_BRUTO = @p11 WHERE Id = @p12;@p0 = NULL, @p1 = 
NULL, @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL, @p6 = NULL, @p7 
= NULL, @p8 = NULL, @p9 = 05/09/2005 12:00:00 a.m., @p10 = NULL, @p11 
= 0, @p12 = 3547

NHibernate: UPDATE Supervisores SET Nombre = @p0, Supervisor = @p1, 
Cedula = @p2, Cargo = @p3, Localidad = @p4, DES_TRASLADO = @p5, 
DES_CAMBIO = @p6, F_TRASLADO = @p7, F_CAMBIO = @p8, F_INGRESO = @p9, 
F_EGRESO = @p10, SUELDO_BRUTO = @p11 WHERE Id = @p12;@p0 = NULL, @p1 = 
NULL, @p2 = NULL, @p3 = NULL, @p4 = NULL, @p5 = NULL, @p6 = NULL, @p7 
= NULL, @p8 = NULL, @p9 = 01/01/0001 12:00:00 a.m., @p10 = NULL, @p11 
= 0, @p12 = 4628

它首先更新两个不同的实体......然后都没有 我要删除的那个,我提供的要删除的实体的 ID 是:4601 请,对此的任何帮助将不胜感激。

【问题讨论】:

    标签: nhibernate sqldatetime


    【解决方案1】:

    NHibernate 正在更新这些实体,因为您正在使用的会话已在某个时间点加载了它们。当它加载它们时,它们被存储在一级缓存中。然后随后对其进行了修改。然后,当您提交事务时,NHibernate 会刷新会话,从而检查其缓存中的任何实体是否“脏”(即需要更新),并更新这些实体中的任何一个。

    因此,请检查您是否在 Session 生命周期的某个时间点加载这些实体。

    【讨论】:

    • 在我尝试删除其中一个之前,那些实体已经加载了相同的 ISession。但我确定我没有修改任何内容。无论如何,我会尝试检查代码以确保我没有更新实体。
    • @jhenriquez,您可能没有明确修改它们,但如果某些值在数据库中可以为空,但在您的模型中不能为空(如 Ingreso 似乎是),NHibernate 会认为该值已修改.
    • 非常感谢!你给我指出了正确的方向。考虑到我目前的情况,我决定使用不同的会话来删除实体,因此不需要刷新任何更改。
    猜你喜欢
    • 2011-02-11
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多