Отклонение строк вставки с помощью Entity Framework и PostgreSQL

#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. Спасибо за информацию, я посмотрю на это.