2011-05-26 58 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

相关问题