0

在我们继承的一个基于 DevExpress 的应用程序(Winforms)中,使用了一个 UnitOfWork 类型的对象来跟踪和保存数据库中的多条记录。通常,使用 UnitOfWork.CommitChanges() 方法单击按钮可以将大约 100 个对象保存在数据库中;插入记录的表对列具有唯一约束。不同的用户可能会尝试处理相同的实体并尝试在该表中的唯一列中输入相同的值。因此,在使用 UnitOfWork.CommitChanges() 之前,我们应该测试数据库中是否已经存在一个或多个值。在调用 UnitOfWork.CommitChanges() 之前测试一个或多个对象是否已经在数据库中的最佳方法是什么,以便我们可以肯定地警告用户他的验证?

谢谢

4

2 回答 2

0

您要求的功能无法在多用户系统中实现。由于每个用户(必然)都在自己的数据库事务中工作,因此用户总是有机会使用另一个用户之前插入的键来插入数据行。您只能通过使用自动生成的密钥等数据库机制来避免这种情况。但我认为这不适用于你。

所以我建议捕捉 commitChanges 抛出的异常并对其采取行动。

于 2013-07-16T15:43:26.577 回答
0

这不是 DevExpress 的真正工作方式,请参阅关于自动生成密钥的帮助主题。

但是,由于您已经继承了代码,您可以使用UnitOfWork.GetObjectsToSave()来获取您即将提交的IXPObjects的ICollection 。从此集合中,您可以生成潜在密钥冲突的列表。然后您可以使用UnitOfWork.ExecuteScalar()运行直接 SQL 命令来确定是否存在冲突并解决它们。

UnitOfWork.CommitChanges()调用 CommitTransaction,因此您可以在 UnitOfWork 事件之一中执行此检查,例如UnitOfWork.BeforeCommitTransaction

与 DevExpress 一样,您最好的支持选择是DevExpress 支持中心

于 2013-07-17T08:31:04.423 回答