C# 拒绝使用实体框架和PostgreSQL插入行

C# 拒绝使用实体框架和PostgreSQL插入行,c#,entity-framework,postgresql,C#,Entity Framework,Postgresql,我在一些项目中使用了PostgreSQL和EF6 我想静默地拒绝我插入的具有重复数据的某些行。该表非常简单,看起来像: CREATE TABLE data ( table_id PRIMARY KEY table_element ) 将id_表作为自动递增键 在PostgreSQL方面,我使用以下简单触发器拒绝重复项: CREATE OR REPLACE FUNCTION checkDuplicate() RETURNS trigger AS DECLARE datac

我在一些项目中使用了PostgreSQL和EF6

我想静默地拒绝我插入的具有重复数据的某些行。该表非常简单,看起来像:

CREATE TABLE data
(
  table_id PRIMARY KEY
  table_element 
)
将id_表作为自动递增键

在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不会按预期插入行

但是,实体框架抛出了一个
System.Data.Entity.Infrastructure.DbUpdateException
,其中包含一条可预期的消息
,为不可为空的成员“table_id”返回了一个空存储生成的值
;表id显然从未设置,因为该行被拒绝


我想知道如何告诉Entity Framework忽略该行,而不是触发异常并继续插入下一行。

另外,对于EF问题,触发器也是错误的。除非首先
锁定表,否则它在并发插入时无法可靠地工作。。。在独占模式下
表格。它受制于没有谓词锁定就无法求解的竞争条件。如果使用
SERIALIZABLE
事务,我认为可能会导致冲突,不过我想做一些测试和检查以确保安全。您需要检查触发器内的隔离级别,如果它不可
序列化
,则会引发错误,以确保应用程序没有意外使用
读取提交的
隔离。感谢您提供的信息,我将查看此信息。