#c# #entity-framework #postgresql
#c# #entity-framework #postgresql
Вопрос:
Я использую PostgreSQL и EF6 в каком-то проекте.
Я хочу молча отклонить некоторые строки, которые я вставляю, которые имеют дублированные данные. Таблица очень простая, выглядит как :
CREATE TABLE data
(
table_id PRIMARY KEY
table_element
)
С id_table в качестве ключа автоинкремента.
На стороне PostgreSQL я использую этот простой триггер для отклонения дубликатов :
CREATE OR REPLACE FUNCTION checkDuplicate()
RETURNS trigger AS
DECLARE
datacount integer;
BEGIN
SELECT Count(table_id) into datacount
FROM data WHERE table_element = NEW.table_element;
IF (datacount > 0) THEN
RETURN null;
ELSE
RETURN new;
END IF;
END;
Эта функция устанавливается как триггер с «ПЕРЕД ВСТАВКОЙ». Когда возвращается значение null, PostgreSQL не вставляет строку, как предполагалось.
Однако Entity Framework выдает System.Data.Entity.Infrastructure.DbUpdateException
ожидаемое сообщение A null store-generated value was returned for a non-nullable member 'table_id'
; table_id, очевидно, никогда не устанавливается, поскольку строка была отклонена.
Я хотел знать, как я могу указать Entity Framework просто игнорировать строку вместо запуска исключения и продолжить вставку следующих строк.
Комментарии:
1. Отдельно к проблеме EF триггер также неверен. Он не будет надежно работать при одновременных вставках, если вы сначала
LOCK TABLE ... IN EXCLUSIVE MODE
не запустите таблицу. Это зависит от условий гонки, которые невозможно разрешить без блокировки предикатов . Если вы используетеSERIALIZABLE
транзакции, я думаю, вы можете вызвать конфликт, хотя я бы хотел провести некоторое тестирование и проверку, чтобы быть уверенным. Вы хотели бы проверить уровень изоляции в триггере и вызвать ошибку, если это неserializable
для того, чтобы убедиться, что приложение случайно не использовалоREAD COMMITTED
изоляцию.2. Спасибо за информацию, я посмотрю на это.