在我们继承(Winforms)基于DevExpress的应用程序中,UnitOfWork类型的对象用于跟踪和保存数据库中的多个记录。 通常使用UnitOfWork.CommitChanges()方法在按钮单击时可以在数据库中保存大约100个对象; 插入记录的表对列具有唯一约束。 可能会发生这样的情况:不同的用户尝试处理相同的实体并尝试在该表中输入唯一列中的相同值。 因此,在使用UnitOfWork.CommitChanges()之前,我们应该测试数据库中是否已存在一个或多个值。 在调用UnitOfWork.CommitChanges()之前测试一个或多个对象是否已经在数据库中的最佳方法是什么,以便我们可以警告用户他的验证?
谢谢
答案 0 :(得分:0)
您要求的功能无法在多用户系统中实现。由于每个用户(必然)都在他自己的数据库事务中工作,因此用户总是有机会插入具有另一个用户之前插入的密钥的数据行。您只能通过使用自动生成密钥等数据库机制来避免这种情况。但我认为这不适合你。
所以我建议捕获commitChanges抛出的异常并对其进行操作。
答案 1 :(得分:0)
这不是DevExpress的工作方式,请参阅auto-generated keys上的帮助主题。
但是,由于您继承了代码,因此可以使用 UnitOfWork.GetObjectsToSave() 来获取 IXPObjects 的 ICollection 即将承诺。从此集合中,您可以生成潜在关键冲突的列表。然后,您可以使用 UnitOfWork.ExecuteScalar() 运行直接SQL命令来确定是否存在冲突并解决它们。
UnitOfWork.CommitChanges()调用CommitTransaction,因此您可以在其中一个UnitOfWork事件中执行此检查,例如UnitOfWork.BeforeCommitTransaction。
与所有DevExpress一样,您最好的支持选项是DevExpress Support Center。