Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

The type '...' cannot be used as type parameter 'TContext' in the generic type or method 'System.ServiceModel.DomainServices.EntityFramework.LinqToEntitiesDomainService<TContext>'.

4.1.0.0 버전의 EntityFramework을 Nuget을 통해 업그레이드했더니 컴파일 에러가 꽤나 발생하는 군요. ^^;

대부분의 경우 네임스페이스가 바뀌는 바람에 발생한 것이어서 아래 정도의 신규 네임스페이스만 추가해주면 거의 잡혔는데,

using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Core.Objects.DataClasses;

유독 한 개의 에러는 꿋꿋하게 살아남았습니다.

The type 'Test40.WebSiteTest.UnitTestDB2Entities' cannot be used as type parameter 'TContext' in the generic type or method 'System.ServiceModel.DomainServices.EntityFramework.LinqToEntitiesDomainService<TContext>'. There is no implicit reference conversion from 'Test40.WebSiteTest.UnitTestDB2Entities' to 'System.Data.Objects.ObjectContext'.


오류가 발생한 소스 코드는 이렇고,

[EnableClientAccess()]
public class MyODataDomainService : LinqToEntitiesDomainService<UnitTestDB2Entities>
{
	// ...[생략]...
}

LinqToEntitiesDomainService의 정의를 찾아가 보니 다음과 같은 클래스입니다.

// C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.ServiceModel.DomainServices.EntityFramework\v4.0_4.0.0.0__31bf3856ad364e35\System.ServiceModel.DomainServices.EntityFramework.dll

[LinqToEntitiesDomainServiceDescriptionProvider]
public abstract class LinqToEntitiesDomainService<TContext> : DomainService where TContext: System.Data.Objects.ObjectContext, new()
{
	// ...[생략]...
}

그러니까, LinqToEntitiesDomainService에 전달하는 UnitTestDB2Entities 클래스가 "where TContext: System.Data.Objects.ObjectContext" 조건에 맞지 않는다는 것입니다.

그래서 제가 정의한 UnitTestDB2Entities 클래스를 봤는데,

// MyTaskModel.Designer.cs

using System;
using System.ComponentModel;
using System.Data.Entity.Core.EntityClient;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Core.Objects.DataClasses;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Serialization;

[assembly: EdmSchemaAttribute()]
namespace Jennifer40.WebSiteTest.WCFs
{
    public partial class UnitTestDB2Entities : ObjectContext
    {
	// ...[생략]...
	}
}

여기서의 ObjectContext는 System.Data.Entity.Core.Objects 네임스페이스에 있는 ObjectContext였습니다. 왜 이런 일이 발생했냐면? 컴파일 오류가 나길래 "Ctrl + ." 키를 눌러 자동으로 네임스페이스를 추가하려 했고 2개의 선택 사항(System.Data.Entity.Core.Objects, System.Data.Objects)중에 무심코 첫 번째 항목을 선택했던 것입니다.

사실, 원래의 MyTaskModel.Designer.cs 파일은 MyTaskModel.edmx 정의에서 자동 생성되는 파일이었습니다. 그래서 단순히 EntityFramework을 업그레이드 한 후 각종 .edmx 파일을 찾아서 새롭게 저장만 해주면 자동으로 System.Data.Objects 네임스페이스를 잡았을 텐데, 제가 임의로 했기 때문에 이런 오류가 발생한 것이었습니다.

따라서 EntityFramework을 구 버전에서 신 버전으로 마이그레이션 할 때는 다음과 같은 2단계 절차를 따르는 것이 가장 좋습니다.

  1. 우선, .edmx 파일들을 찾아서 명시적인 저장을 한다.
  2. 나머지 오류가 발생하는 것들은 새로운 네임스페이스를 적용해 준다.

끝!




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/26/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13796정성태10/31/20245428C/C++: 184. C++ - ICU dll을 이용하는 예제 코드 (Windows)파일 다운로드1
13795정성태10/31/20245212Windows: 268. Windows - 리눅스 환경처럼 공백으로 끝나는 프롬프트 만들기
13794정성태10/30/20245302닷넷: 2307. C# - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13793정성태10/28/20245170C/C++: 183. C++ - 윈도우에서 한글(및 유니코드)을 포함한 콘솔 프로그램을 컴파일 및 실행하는 방법
13792정성태10/27/20244669Linux: 99. Linux - 프로세스의 실행 파일 경로 확인
13791정성태10/27/20244935Windows: 267. Win32 API의 A(ANSI) 버전은 DBCS를 사용할까요?파일 다운로드1
13790정성태10/27/20244634Linux: 98. Ubuntu 22.04 - 리눅스 커널 빌드 및 업그레이드
13789정성태10/27/20244985Linux: 97. menuconfig에 CONFIG_DEBUG_INFO_BTF, CONFIG_DEBUG_INFO_BTF_MODULES 옵션이 없는 경우
13788정성태10/26/20244478Linux: 96. eBPF (bpf2go) - fentry, fexit를 이용한 트레이스
13787정성태10/26/20245027개발 환경 구성: 730. github - Linux 커널 repo를 윈도우 환경에서 git clone하는 방법 [1]
13786정성태10/26/20245263Windows: 266. Windows - 대소문자 구분이 가능한 파일 시스템
13785정성태10/23/20245008C/C++: 182. 윈도우가 운영하는 2개의 Code Page파일 다운로드1
13784정성태10/23/20245297Linux: 95. eBPF - kprobe를 이용한 트레이스
13783정성태10/23/20244895Linux: 94. eBPF - vmlinux.h 헤더 포함하는 방법 (bpf2go에서 사용)
13782정성태10/23/20244654Linux: 93. Ubuntu 22.04 - 커널 이미지로부터 커널 함수 역어셈블
13781정성태10/22/20244829오류 유형: 930. WSL + eBPF: modprobe: FATAL: Module kheaders not found in directory
13780정성태10/22/20245598Linux: 92. WSL 2 - 커널 이미지로부터 커널 함수 역어셈블
13779정성태10/22/20244896개발 환경 구성: 729. WSL 2 - Mariner VM 커널 이미지 업데이트 방법
13778정성태10/21/20245741C/C++: 181. C/C++ - 소스코드 파일의 인코딩, 바이너리 모듈 상태의 인코딩
13777정성태10/20/20244970Windows: 265. Win32 API의 W(유니코드) 버전은 UCS-2일까요? UTF-16 인코딩일까요?
13776정성태10/19/20245333C/C++: 180. C++ - 고수준 FILE I/O 함수에서의 Unicode stream 모드(_O_WTEXT, _O_U16TEXT, _O_U8TEXT)파일 다운로드1
13775정성태10/19/20245540개발 환경 구성: 728. 윈도우 환경의 개발자를 위한 UTF-8 환경 설정
13774정성태10/18/20245216Linux: 91. Container 환경에서 출력하는 eBPF bpf_get_current_pid_tgid의 pid가 존재하지 않는 이유
13773정성태10/18/20244906Linux: 90. pid 네임스페이스 구성으로 본 WSL 2 + docker-desktop
13772정성태10/17/20245196Linux: 89. pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계
13771정성태10/17/20245096Linux: 88. WSL 2 리눅스 배포본 내에서의 pid 네임스페이스 구성
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...