2014-09-30 2 views
0

У меня есть следующая таблица:Breezejs Уникальный Constraint с Delete

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 устанавливает поле YESNO другой строки, чтобы быть Y.

origEntity.entityAspect.setDeleted(); 
otherEntity.YesNo('Y'); 

При выполнении реальных операций DB, Бриз FIRST обновление второй строки к Y, до совершенствуя удаление оригинала. Это нарушает уникальное ограничение. Есть ли простой способ сделать DELETE первым, или мне нужна специальная обработка удаления на стороне сервера?

ответ

0

Breeze не контролирует порядок операций, выполняемых на сервере. Вы не сказали, какую технологию вы используете на сервере, но теги вопросов говорят мне, что это EF и SQL Server. В этом случае EF выполняет обновления перед удалением.

Желаю, чтобы был способ сказать EF, что делать. Это невозможно, насколько я знаю.

Вы можете взять верх, и это не сложно сделать, особенно если вы можете изолировать эту последовательность операций от других. Взгляните на методы beforeSave .... Если вам нужны обе части сохранения внутри одной и той же транзакции (вероятно), узнайте, как настроить собственную внешнюю транзакцию, чтобы вы могли сделать два вызова в EF (или непосредственно в базе данных), один для удаления, а другой для обновления.

Смежные вопросы