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的記錄。 任何人都可以提供相同的幫助。
嗨,奧列格,感謝您的答覆,但沒有像NBCernate會話存在執行更新等方法。此外,它將在交易完成後執行。 – Pijush 2011-05-26 09:47:06
@Pijush,哦,對不起,我再次搞砸了。除了可能的內存問題外,這看起來很好。確保你的FileList – Oleg 2011-05-26 10:15:28
@ Oleg中沒有重複的(根據Equals()方法)條目,我得到了問題......當我在循環中沖洗會話的每一步時。記錄正在逐一進行,換句話說,它不是批處理過程,但是當我使用批處理時,它不允許在同一會話中出現重複記錄。與我選擇的組合鍵相關的問題。感謝您的幫助oleg :) – Pijush 2011-05-27 05:01:54