2011-05-16 49 views
0

我想刪除一個對象,並收到SqlTypeException:SqlDateTime溢出。NHibernate: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 請任何幫助,將不勝感激。

回答

1

NHibernate正在更新這些實體,因爲您正在使用的會話已經在某個時間加載了它們。當它加載它們時,它們被存儲在一級緩存中。隨後他們被修改。當你提交事務時,NHibernate刷新會話,從而檢查其緩存中是否有任何實體「髒」(即需要更新),並更新這些實體。

因此,請檢查您是否在Session的生命週期中的某個時刻加載了這些實體。

+0

在我嘗試刪除其中一個之前,那些實體軟件加載了相同的ISession。但我確定我沒有修改任何內容。無論如何,我會嘗試檢查代碼以確保我沒有更新實體。 – jhenriquez 2011-05-16 18:33:31

+0

@jhenriquez,你可能沒有明確地修改它們,但是如果某些值在數據庫中可以爲空,但在你的模型中不能爲空(就像Ingreso看起來那樣),NHibernate會認爲值被修改了。 – Vadim 2011-05-16 18:43:51

+0

非常感謝!你指出了我正確的方向。考慮到我目前的情況,我決定使用不同的會話來刪除實體,所以它不需要刷新任何更改。 – jhenriquez 2011-05-16 19:59:58