2016-06-29 41 views
0

我已将POCO映射到视图。当EF确实插入,它生成以下命令插入视图中不返回主键

INSERT INTO "public"."vw_place"("Name","Description","Point") VALUES ($1,$2,$3) RETURNING "PlaceId" 

但代码,引发以下错误...

{“空存储生成的值被用于返回非空的成员 类型的“PlaceId 'DataAccess.Place'。”}

这里是触发功能,做插入...

CREATE OR REPLACE FUNCTION vw_place_dml() 
    RETURNS trigger AS 
$BODY$ 
        BEGIN 
         IF TG_OP = 'INSERT' THEN 

         INSERT INTO tbl_place 
         (
         "Name", 
         "Description", 
         "Point" 
        ) 
        VALUES 
        (
         NEW."Name", 
         NEW."Description", 
         ST_GeomFromWKB(NEW."Point", 4326) 
        ); 

          RETURN NEW; 

          ELSIF TG_OP = 'UPDATE' THEN 

          UPDATE tbl_place SET 
         "PlaceId" = NEW."PlaceId", 
         "Name" = NEW."Name", 
         "Description" = NEW."Description", 
         "Point" = ST_GeomFromWKB(NEW."Point", 4326) 
        WHERE 
         "PlaceId" = OLD."PlaceId"; 

          RETURN NEW; 

          END IF; 
          RETURN NEW; 
          END; 
       $BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION vw_place_dml() 
    OWNER TO postgres; 

如果我在pgAdmin中运行它,它不会返回任何内容,这是问题,但行已成功插入并生成了PlaceId。

INSERT INTO "public"."vw_place"("Name","Description","Point") VALUES 
('ergw','regr','\x0101000000000000009846b2bfe4e068d7ff33a73f') 

RETURNING "PlaceId" 

回答

0

在触发功能插入后和RETURN NEW;之前,我加...

NEW."PlaceId" = currval('"tbl_place_PlaceId_seq"'); 
+1

不知道这是并发安全。在Sql Server中不是。 Doens't Postgresql有相当于SS的'Scope_Identity'功能吗? –

+0

我认为就是这样。它在这里说currval,https://www.postgresql.org/docs/8.2/static/functions-sequence.html,“请注意,因为这是返回一个会话本地值,它给出了一个可预测的答案,无论其他自本届会议以来,会议已经执行了nextval。“ –