【发布时间】: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<long>作为键,而不是long。第二次保存它并没有引发异常,但它也没有第二次添加对象。如果在映射文件中将unsaved-valueattributes 添加到id元素会发生什么?
标签: c# nhibernate