Entity Framework 4, 복합 유형, StoredProcs 및 임시 테이블 문제

complextype entity-framework

문제

Entity Framework 4에서 무릎을 껍질을 벗기고 약간의 문제가 있습니다.

EDMX를 사용하기 위해 저장 프로 시저가 있습니다. 이러한 procs로 복잡한 유형을 만들 때 EF는 열 정보를 가져 오는 데 아무런 문제가 없습니다. 한 곳을 제외하고. 잠시 당혹 스러울 때, 문제를 일으키는 것이 임시 테이블로 채워지는 것으로 파악됩니다. 실제로 INSERT를 문제의 원인이되는 임시 테이블에 호출하는 것입니다. 실제로 어떤 정보로도 채워지지는 않습니다.

복잡한 유형을 수동으로 작성한 다음 그 유형에 기능을 맵핑 할 수 있다는 것을 알고 있지만, EF가이 기능을 저에게 맡길 수 있기를 원합니다. 아무도 내가 뭘 잘못하고 있는지 알아?

다음은 작동하지 않는 샘플 proc입니다. DB에서 이것을 실행하고 proc을 EDMX에 추가하십시오. 그런 다음 "함수 가져 오기 추가"화면에서 열 정보를 가져 오십시오. 아무 것도 반환되지 않습니다. 임시 테이블에 대한 INSERT를 주석 처리하고 열 정보를 얻으면 작동합니다.

고마워, 스티브

CREATE PROCEDURE dbo.TestProc
AS

SET NOCOUNT ON  

    CREATE TABLE #TempTable(
        StartDate datetime
    )

    INSERT INTO #TempTable
    SELECT  null


    DROP TABLE #TempTable

    SELECT 1 AS ReturnValue

SET NOCOUNT OFF
GO

인기 답변

시도 할 몇 가지.

  1. 대신 변수 테이블을 사용하십시오 -> 어쩌면 가져 오기 마법사가 선호합니까?
  2. 반환 필드의 이름을 지정하십시오.

다음 저장된 proc (테스트되지 않은 .. 큰 소리로 생각하는 ... 사용하여보십시오)

CREATE PROCEDURE dbo.Foo
AS

    SET NOCOUNT ON

    DECLARE @ResultTable TABLE (SomeId INTEGER)

    INSERT INTO @ResultTable
    SELECT DISTINCT Id AS Identity -- Or u can rename this field to anything...
    FROM SomeExistingTableWhichHasAnIdentityField

GO

마법사를 새로 고침 해보십시오.

-

시도 # 2 :)

좋아 .. 언제 EF 디자이너 / 마법사 / 정확히 무엇을 내 저장된 proc 돌아올 수 있다고 생각하지 못했습니다, 나는 일반적으로 다음을 수행합니다 : -

  1. EF 디자이너 / 컨텍스트 등에서 스토어드 프로 시저가 전혀 존재하지 않는지 확인하십시오 (깨끗한 시작점이 있음)
  2. 저장 프로 시저를 열고 /* /* 프로 시저 정의 후 모든 것을 주석 처리합니다.

예 .. ..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    /* 
    .... every thing in here is commented out 
    */
GO

Now ... 3. 저장된 proc 파일에 가짜 리턴 값을 추가합니다. (다소간) 단지 출력 구조 / 필드를 정의 합니다.

예 .. ..

ALTER PROCEDURE dbo.Foo
(
    Bar1 INT,
    Bar2 TINYINT,
    ... // whatever u have as your optional input arguments //
)
AS
    SET NOCOUNT ON

    SELECT 1 AS Id, 1 AS UserId, 1 AS SomeOtherId, 
        CAST('AAA' AS NVARCHAR(350)) AS Name,
        -- etc etc etc..
    /* 
    .... every thing in here is commented out 
    */
GO

그리고 나서 ...

  1. 이 저장된 proc을 EF 디자이너 / 마법사 / etc ...에 추가하십시오. 이제 올바른 필드는 디자이너가 '결정'해야합니다. 굉장한. 예 .. 값은 모두 하드 코드되었지만 괜찮습니다 (지금까지).
  2. 일단 EF가 이제는 제대로 업데이트 되었다면, 저장된 proc로 돌아가서 위의 단계에서 수행 한 하드 코딩 된 SELECT를 모두 제거하십시오. 이제 우리는 전체 실제 코드를 주석 처리 한 주석을 제거합니다. 원래 저장된 proc을 가져야합니다.

... 이제 EF가 업데이트되어 저장 프로 시저의 배관을 변경 한 사실을 알 수 없습니다.

승리 :)

이거 작동합니까?



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.