我在下面的代码中遇到此错误。我不明白它是如何给出重复键值错误的。密钥确实存在于数据库中,但代码指定Merge
。此外,当我第一次创建实体并将其保存到数据库时,一切都很好,错误只发生在之后的保存上。如果我在Session.Refresh
之前添加一行来执行Session.Merge
(将实体恢复到db中的值),则不会发生错误。这无法做出任何改变,但它表明它不喜欢对entity
的改变。我尝试过使用cascade
的不同值,但没有区别。该表有两列ProjectId
和FeatureId
,两者都是主键。是什么给了什么?
合并的第一部分似乎包含SQL删除和删除失败。
无法执行批处理命令。[SQL:SQL不可用] Cystem.Data.SqlClient.SqlException(0x80131904):违反PRIMARY KEY约束'PK_tblProjectFeature'。无法插入重复键 对象'dbo.tblProjectFeature'。重复的键值是(179, 5844)。违反PRIMARY KEY约束'PK_tblProjectFeature'。 无法在对象'dbo.tblProjectFeature'中插入重复键。该 重复键值为(179,5844)。
public virtual T Merge (T entity)
{
using (ITransaction transaction = this.Session.BeginTransaction())
{
try
{
Session.Merge(entity);
transaction.Commit();
}
catch (System.Exception ex)
{
transaction.Rollback();
throw ex;
}
}
return entity;
}
的hbm.xml
<bag name="Projects" table="tblProjectFeature" inverse="false" lazy="true" cascade="none">
<key>
<column name="FeatureId" sql-type="int" not-null="true" />
</key>
<many-to-many class="BusinessEntities.Project, Infrastructure.Interface">
<column name="ProjectId" sql-type="int" not-null="true" />
</many-to-many>
</bag>
答案 0 :(得分:0)
将映射文件更改为inverse
为真。