gpt4 book ai didi

nhibernate - 使用 NHibernate 删除表中所有行的最佳方法?

转载 作者:行者123 更新时间:2023-12-03 07:50:11 24 4
gpt4 key购买 nike

为了保持我的集成测试独立,我在每次测试之前删除所有旧数据并插入新测试数据。有没有比简单地查询所有实体并一个一个地删除它们更好的方法呢?

我曾考虑编写一个运行“从表名中删除”的存储过程;对于每个要清除的表。这应该会快一些,但最好不要执行 SQL 查询或通过 NH 调用 SP。

我正在使用 Vanilla NHibernate 和 Linq 到 NHibernate。我相信 CaSTLe Active Record 有类似 Foo.DeleteAll() 的东西,但我不想在这个项目中使用 Active Record。

有任何想法吗?

谢谢/埃里克

更新:

自从提出并回答了这个问题以来,NHibernate 团队已经取得了进展。正如 Ayende 在 this blog post 中解释的那样,您现在可以直接执行 DML 查询,而无需 NHibernate 获取任何实体。

要删除所有 Foo 对象,您可以这样做:

using (ISession session = ...)
using (ITransaction transaction = session.BeginTransaction())
{
session.CreateQuery("delete Foo f").ExecuteUpdate();

transaction.Commit();
}

此查询将生成以下 SQL:
delete from Foo

这比首先获取实体然后删除它们要快得多。不过要小心,因为像这样的查询不会影响 1 级缓存。

最佳答案

在我的单元测试的拆解中,我主要是这样做的:

using( ISession s = ... )
{
s.Delete ("from Object o");
s.Flush();
}

这应该删除所有实体。
如果要删除一个特定实体的所有实例,可以执行以下操作:
using( ISession s = .... )
{
s.Delete ("from MyEntityName e");
s.Flush();
}

当然,这种方法有一个缺点,那就是 NHibernate 会先获取实体,然后再删除它们。

关于nhibernate - 使用 NHibernate 删除表中所有行的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/490958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com