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