【问题标题】:Tell NHibernate to execute an Insert-Statement告诉 NHibernate 执行一个插入语句
【发布时间】:2012-03-27 21:41:21
【问题描述】:

我使用 NHibernate 和 Repository-Pattern。存储库具有方法 Insert() 和 Update()。 现在,Insert() 调用 Session.Save(entity) 和 Update() 调用 Session.Merge(entity)。 我的实体有用于 PrimaryKey 的休闲映射:

    <id name="Id" column="TBADRPERSON_ID" type="Int32" unsaved-value="0">       
                    <generator class="assigned"/>
    </id>

id 是我分配的。现在, Session.Save(entity) 首先执行 Select 以查看实体是新的还是已经存在的。但是在 Insert()-Case 中,实体总是新的。我现在正在寻找一种方法来告诉 NHibernate 始终进行插入 - 而不是首先选择然后插入。 我已经看到,我可以使用 Version-Property 来做到这一点 - 但我无法更改 Database-Schema。

感谢您的帮助。

【问题讨论】:

    标签: c# sql-server-2008 nhibernate crud nhibernate-3


    【解决方案1】:

    如果你想一直保存,也许你可以试试:

    <id name="Id" column="TBADRPERSON_ID" type="Int32" unsaved-value="any">       
                    <generator class="assigned"/>
    </id>
    

    然后为 Insert() 执行 Session.SaveOrUpdate(),为 Update() 执行 Session.Merge() 然后 Session.SaveOrUpdate()

    【讨论】:

      【解决方案2】:

      我认为您应该删除属性 unsaved-value="0"。 当您保存实体时,Nhibernate 会将 id 与“0”进行比较。 如果不相等,如果它不在会话中,则 Nhibernate 首先选择它。

      【讨论】:

        【解决方案3】:

        我认为您可以使用 session.Update() 而不是 session.Merge(),它不会从数据库加载实体。或者,您可以在所有情况下使用 session.SaveOrUpdate()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-11
          相关资源
          最近更新 更多