合并时重复键值错误

时间:2017-09-28 17:21:39

标签: c# nhibernate

我在下面的代码中遇到此错误。我不明白它是如何给出重复键值错误的。密钥确实存在于数据库中,但代码指定Merge。此外,当我第一次创建实体并将其保存到数据库时,一切都很好,错误只发生在之后的保存上。如果我在Session.Refresh之前添加一行来执行Session.Merge(将实体恢复到db中的值),则不会发生错误。这无法做出任何改变,但它表明它不喜欢对entity的改变。我尝试过使用cascade的不同值,但没有区别。该表有两列ProjectIdFeatureId,两者都是主键。是什么给了什么?

合并的第一部分似乎包含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>

1 个答案:

答案 0 :(得分:0)

将映射文件更改为inverse为真。