【问题标题】:NHibernate does not throw exception when calling Session.Save on persisted entity在持久化实体上调用 Session.Save 时 NHibernate 不会抛出异常
【发布时间】:2016-05-14 02:57:36
【问题描述】:

我正在编写一个测试用例,以确保我的服务/存储库层按预期工作。我正在调用ISession.Save 并使用一个已在单独事务中持久保存到数据库的实体。我希望Save 抛出异常,因为该实体不是新的。而是向数据库中添加一个新条目并更新实体的 ID。

第一个问题:这是预期的吗?据我所知,它应该引发异常,但我无法在NHibernate documentation 中明确找到它。

一些代码:

public class Dashboard 
{
    public int ID { get; set; }
}

// Dashboard.hbm.xml:
<class name="Dashboard" table="Dashboard" lazy="false">
    <id name="ID" column="ID">
        <generator class="identity" />
    </id>
</class>

Dashboard dashboard = new Dashboard();
using(var transaction = Session.BeginTransaction())
{
    Session.Save(dashboard);
    transaction.Commit();
}

Session.Flush();

using(var transaction = Session.BeginTransaction())
{
    Session.Save(dashboard);
    transaction.Commit();
}

我的理解是上面的代码应该会抛出异常。这是正确的吗?

【问题讨论】:

  • 不知道它是否应该抛出异常,但是你应该在 99% 的时间里使用 SaveOrUpdate .. 潜伏在这里希望有人能给出一个体面的解释
  • 我不同意。我不喜欢离开 NHibernate 是否发生 Save 或 Update。根据到达的 API 端点,我们已经知道是否需要保存或更新。在存储库层中允许歧义似乎是不正确的。
  • 您的代码应该确保一致性,我永远不会相信数据层约束。自己进行检查,避免框架和/或实际存储中当前和未来的错误。
  • 那我们不是说同样的话吗?您不应该依赖 SaveOrUpdate 吗? :p
  • 我在现有的安装中尝试了这个。我的实体对象使用Nullable&lt;long&gt; 作为键,而不是long。第二次保存它并没有引发异常,但它也没有第二次添加对象。如果在映射文件中将unsaved-valueattributes 添加到id 元素会发生什么?

标签: c# nhibernate


【解决方案1】:

我选择自己抛出异常来手动处理这个问题。

类似:

public void Save(T entity)
{
    if (entity.ID != 0)
        throw new InvalidOperationException("Attempted to save an entity which has already been saved.");

    Session.Save(entity);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多