こんにちは、仕事でハマり全然進んでないことがあり、質問します。
下記のように、EntityFramework6でedmxを生成する時、PostgreSQLのDB関数の中で戻り値がrecord型になっている関数がエラーを起こし、ストアドプロシージャ/関数が生成されない問題にはまっています。
何か、対応策又は解決策があれば教えていただけますでしょうか。
「やりたいこと」
PostgreSQL9.3に定義されているデータベースからテーブルと関数を読み込み、Entity Data Model(edmx)を作成したい。
「はまっているところ」
edmxを生成すると、テーブルとエンティティは問題なくインポートされ、項目が生成されるけど、ストアドプロシージャ/関数は以下のようなエラーが4件吐き出され、生成されなくインポートもできない。
- エラー136:構成できる関数及び関数インポートでは、戻り値の型を宣伝する必要があります。
「調べたこと」
- 現在DBには7つの関数があり、3つの関数は戻りの型がintegerとreal型であり、残り4つがrecord型になっている。エラー4件は、このrecord型を戻り値にしている関数が原因として考えられる。
- 検索してみたところ、EntityFrameworkではrecord型に対応するストア(SSDL)型とEDM型が見つからなかったので、record型が戻り値で設定されている関数がエラーになるのではないか?と予想している。
- 他のメンバーが手動でDB関数をC#プロジェクト中のedmxスキーマ定義言語に追加してみたものの、上手く動かずエラーになってしまった。[カスタムデータベース関数を呼び出す方法]( https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions)
「追加項目」
戻りの型が「record」になっている関数の中で1つをサンプルとして追加記述します。残り3つも中身はあまり変わらないです。
SQL
1-- Function: testfunc() 2 3-- DROP FUNCTION testfunc(); 4 5CREATE OR REPLACE FUNCTION testfunc( 6 OUT ngeneidmin numeric, 7 OUT ngeneidmax numeric, 8 OUT tstart_at timestamp without time zone, 9 OUT sstart_user character varying, 10 OUT nresult integer) 11 RETURNS record AS 12$BODY$ 13 14DECLARE 15 16BEGIN 17 nresult := 0; 18 SELECT * INTO ngeneidmin, ngeneidmax, tstart_at, sstart_user 19 FROM auto_placement_manage; 20 21EXCEPTION 22 WHEN OTHERS THEN 23 nresult := -1; 24END; 25 26$BODY$ 27 LANGUAGE plpgsql VOLATILE 28 COST 100; 29ALTER FUNCTION testfunc() 30 OWNER TO owner_user;
何か情報が足らない、もっと教えてほしいことがありましたらコメントください。
以上、よろしくお願いします。
あなたの回答
tips
プレビュー