2011-05-26 70 views
0

我有特性的類NHibernate.NonUniqueObjectException:一個不同的對象使用相同的標識符值已經與會話相關聯

[Serializable] 
public class MyClass { 



    public MyClass () 
    { 
    } 




    public virtual System.DateTime Time  { 
     get; 
     set; 
    } 


    public virtual string Name  { 
     get; 
     set; 
    } 

    public virtual string Department  { 
     get; 
     set; 
    } 

    public virtual string Ip 
    { 
     get; 
     set; 
    } 


    public virtual string Address  { 
     get; 
     set; 
    } 


    public override bool Equals(object obj) 
    { 

     if (obj == null) 

      return false; 

     MyClass t = obj as MyClass ; 

     if (t == null) 

      return false; 

     if (this.Time == t.Time && this.Name== t.Name && this.Department== t.Department) 

      return true; 

     else 

      return false; 

    } 

    public override int GetHashCode() 
    { 

     int hash = 13; 

     hash = hash + 

      (null == this.Time ? 0 : this.Time.GetHashCode()); 

     hash = hash + 

      (null == this.Name? 0 : this.Name.GetHashCode()); 

     hash = hash + 

     (null == this.Department ? 0 : this.Department.GetHashCode()); 

     return hash; 

    } 
} 

我有我的Nhibernate的映射作爲

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NhibernateTest" assembly="NhibernateTest"> 
    <class name="MyClass" table="NhibernateTest"> 
     <composite-id> 
      <key-property column="Time" type="DateTime" name="Time"></key-property> 
      <key-property name="Name" type="string" column="Name" ></key-property> 
      <key-property name="Department" type="string" column="Department" ></key-property> 
     </composite-id> 
     <property column="Ip" type="string" name="Ip" /> 
     <property column="Address" type="string" name="Address" /> 
    </class> 
</hibernate-mapping> 

我試圖使用複合密鑰對一些40k數據進行批量上傳。使用下面的代碼。

public void StoreInRDBMS(List<MyClass> FileList) 
    { 

     ITransaction transaction = null; 
     try 
     {  
      var stopwatch = new Stopwatch(); 

      stopwatch.Start(); 

      ISession session = OpenSession(); 
      using (transaction = session.BeginTransaction()) 
      { 

       foreach (var File in FileList) 
       { 

        session.SaveOrUpdate(File); 



       } 

       session.Flush(); 
       session.Clear(); 
       transaction.Commit(); 

      } 

      session.Close(); 


      stopwatch.Stop(); 

      var time = stopwatch.Elapsed; 





     } 
     catch (Exception ex) 
     { 

      transaction.Rollback(); 

     } 
    } 

但問題,而在迭代循環列表中的第二個記錄引發此錯誤

{「具有相同的標識符值不同的物體已經與所述會話相關聯:NhibernateTest.MyClass ,實體:NhibernateTest.MyClass「} 雖然記錄是唯一的。並且如果根本不是,它應該更新相同的。

它工作的文件,如果我每次迭代後刷新會議在循環一樣

   foreach (var File in FileList) 
       { 

        session.SaveOrUpdate(File); 

        session.Flush(); 
        session.Clear(); 


       } 

不應該是這樣的,如果用上述方法做,即使它說話17分鐘爲40K的記錄。 任何人都可以提供相同的幫助。

回答

0

也許吧?

foreach (var File in FileList) 
       { 

        session.SaveOrUpdate(File); 
        session.ExecuteUpdate(); 


       } 
+0

嗨,奧列格,感謝您的答覆,但沒有像NBCernate會話存在執行更新等方法。此外,它將在交易完成後執行。 – Pijush 2011-05-26 09:47:06

+0

@Pijush,哦,對不起,我再次搞砸了。除了可能的內存問題外,這看起來很好。確保你的FileList – Oleg 2011-05-26 10:15:28

+0

@ Oleg中沒有重複的(根據Equals()方法)條目,我得到了問題......當我在循環中沖洗會話的每一步時。記錄正在逐一進行,換句話說,它不是批處理過程,但是當我使用批處理時,它不允許在同一會話中出現重複記錄。與我選擇的組合鍵相關的問題。感謝您的幫助oleg :) – Pijush 2011-05-27 05:01:54

相關問題