C# 拒绝使用实体框架和PostgreSQL插入行
我在一些项目中使用了PostgreSQL和EF6 我想静默地拒绝我插入的具有重复数据的某些行。该表非常简单,看起来像: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
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
事务,我认为可能会导致冲突,不过我想做一些测试和检查以确保安全。您需要检查触发器内的隔离级别,如果它不可序列化
,则会引发错误,以确保应用程序没有意外使用读取提交的
隔离。感谢您提供的信息,我将查看此信息。