Nhibernate 更改复合id的一部分

Nhibernate 更改复合id的一部分,nhibernate,many-to-many,Nhibernate,Many To Many,我有一个班,BillMedicine,它是Bill和Medicine的多对多表。 BillMedicine映射文件是: <class name="BillMedicine" table="Bill_Medicine"> <composite-id> <key-many-to-one name="Bill" class="Bill" column="BillID" /> <key-many-to-one name="

我有一个班,BillMedicine,它是Bill和Medicine的多对多表。 BillMedicine映射文件是:

<class name="BillMedicine" table="Bill_Medicine">
    <composite-id>
        <key-many-to-one name="Bill" class="Bill" column="BillID" />
        <key-many-to-one name="Medicine" class="Medicine" column="MedicineID" />
    </composite-id>
    <version name="LastModifiedOn" column="LastModifiedOn" type="DateTime" 
             access="field.pascalcase-underscore" />
    <property name="Quantity" column="QuantityPurchased" />
</class>
我已经检查了NHibernate显示的SQL,它没有更新药物

UPDATE Bill_Medicine SET LastModifiedOn = @p0, QuantityPurchased = @p1
WHERE BillID = @p2 AND MedicineID = @p3 AND LastModifiedOn = @p4;
编辑:

我的问题:
1-为什么只更新数量是有效的,而更新药物是抛出异常?

2-是否有可能使Nhibernate更新药品属性?如果是,如何进行?如果没有,有人能建议解决方法吗?

我想你应该创建另一个对象,因为我有似曾相识的感觉。你的努力

  • 使用键B1 M1创建对象
  • 省省吧
  • 保持相同的对象和相同的 参考,将键更改为B1 M2
  • 更新新对象(使用旧对象) (参考)

  • 我建议在保存和更新之间使用
    刷新会话
    ,或者对每个操作使用
    事务
    (不过刷新应该足够了,我建议使用事务,因为这是一种很好的做法:)。我感觉您正在尝试更新尚未插入的对象

    我认为您应该创建另一个对象,因为我有似曾相识的感觉。你的努力

  • 使用键B1 M1创建对象
  • 省省吧
  • 保持相同的对象和相同的 参考,将键更改为B1 M2
  • 更新新对象(使用旧对象) (参考)

  • 我建议在保存和更新之间使用
    刷新会话
    ,或者对每个操作使用
    事务
    (不过刷新应该足够了,我建议使用事务,因为这是一种很好的做法:)。我感觉您正在尝试更新尚未插入的对象

    NHibernate不允许更改主键

    可能的解决办法:

    • 使用新药创建新实例并删除旧实例
    • 用一只手换药。请记住,除非退出实例并再次加载,否则内存中的状态将与数据库不匹配

    NHibernate不允许更改主键

    可能的解决办法:

    • 使用新药创建新实例并删除旧实例
    • 用一只手换药。请记住,除非退出实例并再次加载,否则内存中的状态将与数据库不匹配

    在AddBillMedicine和UpdateBillMedicine中,我正在使用新事务保存/更新。我还尝试添加session.Flush,但没有成功。问题是,如果我只更新数量,更新就会成功,但是如果我更新药物,更新就会失败。此外,我不是在更新新的obejct,而是在更新我刚刚保存的对象。sh_kamath:这是一个新对象,因为它的键不同。在这样的数据库中,B1M1和B1M2应该是不同的对象,如果你考虑表的主键,那么你的注释是正确的。但NHibernate生成的查询正在更新Bill_Medicine表,因此NHibernate似乎知道此对象已插入数据库。在AddBillMedicine和UpdateBillMedicine中,我正在使用新事务保存/更新。我还尝试添加session.Flush,但没有成功。问题是,如果我只更新数量,更新就会成功,但是如果我更新药物,更新就会失败。此外,我不是在更新新的obejct,而是在更新我刚刚保存的对象。sh_kamath:这是一个新对象,因为它的键不同。在这样的数据库中,B1M1和B1M2应该是不同的对象,如果你考虑表的主键,那么你的注释是正确的。但NHibernate生成的查询正在更新Bill_Medicine表,因此NHibernate似乎知道此对象已插入数据库。请注意,NHibernate为UpdateBillMedicine生成的qurey没有更新MedicineID,为什么?请注意,NHibernate为UpdateBillMedicine生成的qurey并没有更新MedicineID,为什么?如何获取旧的MedicineID?假设我已经更改了药品属性,我可以获得旧药品吗?我如何获得旧药品ID?假设我已经改变了药品属性,我可以得到老医生吗?
    UPDATE Bill_Medicine SET LastModifiedOn = @p0, QuantityPurchased = @p1
    WHERE BillID = @p2 AND MedicineID = @p3 AND LastModifiedOn = @p4;