2017-01-04 3 views
0

ここでは、http://www.entityframeworktutorial.net/EntityFramework5/table-valued-function-in-entity-framework5.aspx(EF6を使用)の説明に従ってテーブル値関数を作成し、それをmy edmxにインポートしました。 この後、Returns a collection ofを自分のエンティティMyTable(機能内で選択)に変更しました。すべてのエンティティタイプのキープロパティは、ストレージ関数によって返されるnull不可能な同じ列にマップする必要があります

しかし、私は常に例外

にストレージ機能によって返された同じ非NULL可能列にマップされなければならない関数インポートによって返されるすべてのエンティティタイプのキープロパティを取得します。

私は生成された複素結果、オブジェクトに見ると、すべてのプロパティがnullableですが、私のエンティティMyTableに、私はそうでないにマップします。 SQL-サーバー内で実行すると、期待どおり

CREATE FUNCTION [dbo].[fnGetChildren] 
( 
    -- Add the parameters for the function here 
    @Id uniqueidentifier 
) 
RETURNS TABLE 
AS 
RETURN 
(
    -- Add the SELECT statement with parameter references here 
    WITH childs AS 
    (
     SELECT * FROM MyTable WHERE Id = @Id 
     UNION ALL 
     SELECT MyTable.* FROM MyTable JOIN childs ON MyTable.ParentId = childs.Id 
    ) 

    SELECT * FROM childs WHERE Id <> @Id 
) 

機能が動作します:

この

は(エンティティ自体を除いて指定されたエンティティからすべての子-関係を取得するために)私の関数です。 edmx生成もまた実行されます。しかし、 DbContextでクエリを実行しようとすると、このエラーが発生します(関数のインポートを呼び出すかどうかにかかわらず)。

これは機能自体、EFに問題があるのですか、それとも別の問題がありますか?

あなたは、非NULL可能値を認識するためにEFを強制するために、あなたの SELECTリスト内のキー列の ISNULLを使用することができます

答えて

1

WITH childs AS 
(
    SELECT Id FROM MyTable WHERE Id = @Id 
    UNION ALL 
    SELECT MyTable.Id FROM MyTable JOIN childs ON MyTable.ParentId = childs.Id 
) 

SELECT ISNULL(Id, 0) FROM childs WHERE Id <> @Id 

あなたはSELECT *でこれを行うことはできませんが、しかし、あなたはするべきでありませんとにかくそれをしないでください。

+0

私はすべての列を選択しなければならないのですが、私のエンティティではヌル可能ではないものは 'ISNULL'によってsourroundされるべきですか? – KingKerosin

+0

@KingKerosin、はい、あなたがする必要があります。 – Sefe

+0

BTW: '再帰的な共通テーブル式 '子'にはトップレベルのUNION ALL演算子が含まれていません。 ' – KingKerosin

関連する問題