我有下表:
CREATE TABLE Foo AS (
Id int not null primary key,
YesNo char(1) not null default('N')
)
具有以下约束 - “只有一行可能具有值'Y'”
CREATE UNIQUE NONCLUSTERED INDEX [IX_YesNo] ON [dbo].[Foo]
(
[YesNo] ASC
)
WHERE ([YesNo]=('Y'))
应用程序代码(Breeze JS)强制一行始终为“Y”。因此,如果使用YesNo ='Y'删除行,BLL会将另一个Row的YesNo字段设置为Y.
origEntity.entityAspect.setDeleted();
otherEntity.YesNo('Y');
执行实际的数据库操作时,在执行删除原始操作之前,Breeze首先将另一行更新为Y.这违反了唯一约束。是否有一种简单的方法可以使DELETE首先发生,还是需要特殊的服务器端删除处理?
答案 0 :(得分:0)
Breeze无法控制在服务器上执行的操作顺序。您没有说出您在服务器上使用的技术,但问题标签告诉我它是EF和SQL Server。在这种情况下,EF是在删除之前进行更新。
我希望有办法告诉EF该怎么做。据我所知,这是不可能的。
您可以接管并且这样做并不困难,尤其是如果您可以将这一系列操作与其他操作隔离开来。看一下beforeSave ...方法。如果您需要同一事务中的两个部分保存(可能),请学习如何设置自己的环境事务,以便可以对EF(或直接数据库)进行两次调用,一次执行删除,另一次执行删除操作。做更新。