NHibernate 和 Rhino 存储库的奇怪保存行为

发布于 2024-08-03 17:21:27 字数 1094 浏览 7 评论 0原文

我在使用 NHibernate 时遇到了一些奇怪的行为。我正在从存储库中检索学习者列表,并根据需要更新它们,奇怪的是,当我保存第一个学习者时,对所有学习者所做的更改都被提交到数据库中。

        [Transaction]
        public void UpdateLearner(Learner learner)
        {
            //UnitOfWork.CurrentSession.Save(learner);
        }

有什么想法吗?我没有启用缓存。我知道它与事务有关,因为即使对保存方法的调用被注释掉,更改也会保留下来。

这是我的映射:

<class name="Learner"  table="ILR_Learner">
    <id name="Id" column="ILRLearnerID">
      <generator class="native" />
    </id>
    <property column="LastWarning" name="LastWarning" type="DateTime" />
    <property column="Submitted" name="SuccessfulSubmission" type="DateTime" />

    <join table="vwLearnerLSCUpload">
      <key column="ILRLearnerID" foreign-key="ILRLearnerID"/>
      <property column="Dog" type="DateTime" name="Dog"/>
    </join>

    <join table="Learner">
      <key column="Id" foreign-key="ILRLearnerID"/>
      <property column="Food" name="Food" type="String" length="20" />
    </join>

  </class>

I am experiencing some odd behaviour with NHibernate. I'm retrieving a list of Learners from a repository, updating them as necessary, the odd thing is when I save the first one, the changes made to all the learners are being commited to the database.

        [Transaction]
        public void UpdateLearner(Learner learner)
        {
            //UnitOfWork.CurrentSession.Save(learner);
        }

Any ideas why? I dont have caching enabled. I know its something to do with the transaction as the changes get persisted even with the call to the save method commented out.

This is my mapping:

<class name="Learner"  table="ILR_Learner">
    <id name="Id" column="ILRLearnerID">
      <generator class="native" />
    </id>
    <property column="LastWarning" name="LastWarning" type="DateTime" />
    <property column="Submitted" name="SuccessfulSubmission" type="DateTime" />

    <join table="vwLearnerLSCUpload">
      <key column="ILRLearnerID" foreign-key="ILRLearnerID"/>
      <property column="Dog" type="DateTime" name="Dog"/>
    </join>

    <join table="Learner">
      <key column="Id" foreign-key="ILRLearnerID"/>
      <property column="Food" name="Food" type="String" length="20" />
    </join>

  </class>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

揽月 2024-08-10 17:21:27

更新实体时,会自动跟踪更改。因此,当提交事务时,所有更改的实体都会被持久化。无需致电:

Session.Save(entity);

请参阅此问题。

要禁用每个实体的更改跟踪,您必须从会话中逐出该实体:

Session.Evict(entity);

要保留任何更改,您可以调用:

Session.Update(entity);

When updating entities, changes are tracked automatically. So when the transaction is committed all changed entities are persisted. No need to call:

Session.Save(entity);

See this Question.

To disable change tracking per entity you have to evict the entity from the session:

Session.Evict(entity);

To persist any changes, you would then call:

Session.Update(entity);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文