如果文章行被标记为删除,则文章评论、投票也应该被删除。哪种ORM可以有效处理这个问题? 编辑 我需要用于C# .NET。
DataObjects.Net提供了一种中间解决方案:
因此,这非常快,虽然还不完美:
因此,在DO中,批量删除如下所示:
var customersToRemove =
from customer in Query<Customer>.All
where customer.IsDeleted
select customer;
foreach (customer in customersToRemove)
customer.Remove(); // This will be automatically batched
var customersToRemove =
from customer in Query<Customer>.All
where ...
select customer;
foreach (customer in customersToRemove)
customer.IsRemoved = true; // This will be automatically batched
顺便提一下,我们与各种ORM框架的实体共享了批量CUD操作的测试,网址为ORMBattle.NET。请注意,那里的测试不使用批量服务器端更新(事实上,这样的测试将是数据库性能而不是ORM的测试); 相反,它们测试ORM是否能够优化此问题。无论如何,提供的信息+ 测试代码如果您正在评估多个ORM工具,则可能会有所帮助。
NHibernate支持HQL(面向对象的Hibernate Query Language)更新和删除。
这里有一些例子,可以参考Fabio Maulo的博客文章和Ayende Rahien的博客文章。
它可能看起来像这样:
using (var session = OpenSession())
using (var tx = s.BeginTransaction())
{
session
.CreateQuery("delete from Whatever where IsDelete = true")
.ExecuteUpdate();
tx.Commit();
}
通常,如果您已经使用了IsDeleted标志范例,那么这些项目通常会被应用程序对象模型忽略,这是高效和可靠的,因为不需要检查引用完整性(没有级联),也不会永久破坏数据。
如果您想定期清除IsDeleted行,则使用本机SQL在RDBMS中安排这些作业要更有效率,只要按正确顺序删除事物,以便不会破坏引用完整性。如果您不在DB级别执行引用完整性,则顺序无关紧要。
即使多年来我所有数据库设计都具有强大的引用完整性和约束条件,我从未使用过级联RI-在我的设计中从未需要过。
我正在使用LLBLgen,它可以进行级联删除。你可能想试试它,它非常好用。 例如,从rolenames[]中删除所有username[]的用户。
string[] usernames;
string[] rolenames;
UserRoleCollection userRoles = new UserRoleCollection ();
PredicateExpression filter = new PredicateExpression();
filter.Add(new FieldCompareRangePredicate(UserFields.logincode, usernames));
filter.AddWithAnd(new FieldCompareRangePredicate(RoleFields.Name, rolenames));
userRoles.DeleteMulti(filter)
哪些ORM支持基于“条件”的删除...我使用过的两个(Propel,Doctrine)都支持。我认为除非它们处于开发早期,否则几乎所有ORM都支持,因为这是一个相当基本的功能。但是你在用什么语言?
至于你的级联删除,最好在数据库级别上使用外键来实现。大多数关系型数据库管理系统都支持此功能。如果你使用的是不支持此功能的东西,则一些ORM也会实现此功能。但我的建议是只使用支持此功能的关系型数据库管理系统。从长远来看,这将减少头痛。
大多数ORM都允许您提供SQL提示或在其框架内执行SQL。
例如,您可以使用DLINQ中的ExecuteQuery
方法来实现您想要的功能。以下是有关如何在DLINQ中使用自定义SQL的简要教程。
我认为Entity Framework也应该允许这样做,但我从未使用过,你可以研究一下。
基本上,找到一个具有所需功能的ORM,然后您可以询问如何在所选的ORM中执行此查询。我认为仅为此选择ORM是有风险的,因为还有许多其他因素应该考虑进选择中。