지정된 명명 된 연결이 구성에 없거나 EntityClient 제공자와 함께 사용되지 않거나 유효하지 않습니다.


170

하나의 엔티티 프레임 워크 객체가 있고 프로젝트에 connectionstring 추가 app.config하면 connectionstring섹션에 추가 되지만 새 객체 를 만들고 entitycontext이것을 사용 하려고하면 connectionstring이 오류가 나타납니다.



4
링크 고마워요, 크레이그 제목이 MetadataException 오류를 찾는 데 도움이 되었기 때문에이 스레드를 유지하기 위해 투표합니다.
jp2code

이것은 이상한 이유로 구성 파일이 연결 문자열로 업데이트되지 않았을 때 발생했습니다.
P.Brian.Mackey

답변:


217

솔루션에 두 개 이상의 프로젝트가 있고 edmx파일 을 포함하여 엔티티 프레임 워크 항목이 포함 된 프로젝트가 솔루션의 시작 프로젝트 가 아니라는 사실에서 문제가 발생했다고 생각합니다 . 이 경우 EF app.config프로젝트 에 연결 문자열이 있어도 런타임시 CLR에서 찾을 수 없습니다. 예를 들어 솔루션에 웹 사이트 및 EF 프로젝트가있는 경우 EF 프로젝트 파일 에서 연결 문자열을 복사하고 해당 표면을 마우스 오른쪽 단추로 클릭하고 특성을 선택한 후 연결 문자열을 복사하여 연결 문자열에 붙여 넣어야합니다. 부분. 이렇게하면 구성에 올바른 것을 가지고 있는지 확인할 수 있습니다. 편집 : ObjectContext 생성자의 Documenation에서 여기에서 볼 수 있듯이 app.config 귀하의 웹 사이트에 web.config. 기본적으로 모든 연결 문자열 데이터는 .Net 스레드가 CLR (예 : 시작 프로젝트)에서 시작한 프로젝트의 구성 파일에 있어야합니다. 이것이 귀하의 경우가 아닌 경우에는edmxapp.config


첫 번째 매개 변수는 EDM을 만들 때 생성 된 코드 인 연결 이름입니다. 연결 문자열 이름의 이름이 변경되면 모델을 마우스 오른쪽 단추로 클릭하고 "데이터베이스에서 모델 업데이트 ..."를 선택한 다음 마법사를 따라 confing 및 designer를 업데이트하여이를 반영하십시오. 변화.


1
안녕하세요 Morteza와 귀하의 답변에 감사드립니다.하지만 이전에 web.config에서 연결 문자열을 복사하지만 오류는 해결되지 않지만 entitymodel.designer에서 (public EntityContext ()를 대체 할 때 : base ( "name = EntityContext", EntityContext " )) 이것이 작동 한 연결
문자열을 사용

1
@ Morteza, 실행중인 어셈블리에 app.config가없는 프로젝트에 대한 솔루션이 있습니까? 필자의 경우 호출 실행 파일은 COM Interop을 통해 내 어셈블리 (엔터티 개체가있는 위치)를 호출하는 VB6 앱입니다.
부패하기 쉬운 Dave

4
너무 간단하지만 아직 실망 스럽습니다. 투표합니다. 긴 라이브 스택 오버 플로우!
granadaCoder

3
WCF를 사용하는 경우 서비스 프로젝트에 연결 문자열을 포함시켜야합니다.
Nathan

1
감사합니다 Morteza, 많은 시간을 절약했습니다!
Chris

32

app.config의 연결 문자열을 web.config에 복사하거나 전체 파일을 프로젝트에 복사하여 출력을 표시해야합니다. 프레임 워크를 소비하는 조건 중 하나입니다.


1
프런트 엔드 프로젝트에있는 web.config에 동일한 연결 문자열 (데이터 액세스 프로젝트에서와 같이)을 추가하면됩니다.
Danish

@ Musikero31 EF를 사용하고 코드에서 모든 엔티티 연결 문자열을 정의합니다. 관련 설정에 아무것도 없습니다.
Keith Beard

DAL 파일을 새 프로젝트에 복사 한 후에도 위의 오류가 발생했습니다. 구성 파일을 자세히 살펴보면 연결 문자열이 EF로 바뀌는 것을 알았습니다. 올바른 연결 문자열을 새 프로젝트에 수동으로 복사 / 붙여 넣을 수 있었고 작동했습니다.
라비 램

9

솔루션의 여러 프로젝트에서 사용하기 위해 사용자 지정 데이터베이스 논리를 .dll에 넣으려고 할 때이 문제가 발생했습니다.

.dll에 올바른 app.config 파일이 있지만 작동하지 않았습니다. 엔터티 프레임 워크는 .exe의 app.config에 연결 정보를 원했습니다. 거기에 정보를 복사하는 것은 잘 작동했습니다.

연결 문자열을 .edmx에 직접 붙여 넣는 Morteza의 솔루션은 값을 붙여 넣을 수 없기 때문에 효과가 없었습니다.


3
내 exe의 디렉토리에 app.config (및 해당 디렉토리의 유일한 구성 파일) 만 있었지만 읽지 못했습니다. 파일 이름을 myExe.exe.config로 변경해야했습니다.
Mario

6

안녕 나는이 문제가 있었고 그것은 나를 미치게했다. 어쨌든 마침내 문제가 무엇인지 알아 냈습니다. 가장 먼저해야 할 일은 connectionstringsin app.config과 같은지 확인하는 것 입니다 web.config. 그런 다음 .edmx파일을 두 번 클릭 하여 테이블을 볼 수 있습니다. 일단 테이블 근처가 아닌 테이블 근처의 아무 곳이나 클릭하면 속성으로 이동합니다. 드롭 다운 목록에서ConceptualEntityModel 엔티티 컨테이너 이름을 검색하고 잘 기억하십시오.

그런 다음 edmx 파일의 디자이너로 이동하여 생성자를 엽니 다. (디자이너는 edmx 파일의 하위 폴더입니다.) 생성자는 BASE 매개 변수에 두 개의 매개 변수가 있어야합니다

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

이것은 그들 중 하나입니다. 첫 번째 매개 변수는 파일이있는 프로젝트 파일의 이름을 가져야합니다 .edmx. 두 번째 매개 변수는 앞에서 언급 한 특성의 엔티티 컨테이너 이름을 가져야합니다. 모든 생성자를 다음과 같이 정렬하는 것을 잊지 마십시오.base("", "")

그게 내 문제 였고 내 문제는 그렇게 해결되었습니다. 나는 당신이 이것처럼 당신을 해결할 수 있기를 바랍니다.


6

나는 아무도 다루지 않는 것처럼 이것에 변형을 가졌습니다.

몇 가지 모델이 포함 된 기본 프로젝트와 단위 테스트가 포함 된 테스트 프로젝트가있었습니다. 테스트 프로젝트가 작동했지만 OP에 언급 된 오류로 중지되었습니다. EDMX 파일의 이름을 바꾸거나 이동하지 않았습니다.

많은 조언은 .config 파일 비교에 대해 언급했지만 내 프로젝트에는 전혀 없었습니다.

결국 app.config 파일을 기본 프로젝트에서 내 테스트 프로젝트로 복사 한 다음 작동했습니다. 이것이 올바른 단계인지 또는 추가 모델을 추가 할 때 유지 관리 성 문제가 있는지 여부는 모르겠지만 적어도 현재 단위 테스트가 다시 올바르게 실행되고 있습니다.


이것을 게시 한 후 다른 프로젝트의 app.config 파일에 대한 링크를 만드는 것이 가장 좋습니다. 그러나 여전히 다른 접근 방식은 구성 파일이 전혀 없을 때 원래 문제를 해결하는 데 효과적입니다.
S. Baggy

4

Morteza Manavi의 답변 으로이 문제를 해결할 수 있지만 다른 해결 방법은 연결 문자열을 동적으로 작성하여 ObjectContext의 생성자에 전달하는 것입니다.

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

따라서 적어도 내 경우에는 바람직하지 않은 시작 프로젝트의 app.config에 연결 문자열 정보를 복사 할 필요가 없습니다.


4

연결 문자열에서 providerName = "System.Data.EntityClient"를 속성으로 추가하는 것을 잊었습니다. 이로 인해이 오류가 발생했습니다.

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

대신에

<add name="connectionName" connectionString="metadata=res://*/..." />

2

방금 VS2010의 IIS에서 응용 프로그램을 만들면 웹 사이트 루트의 두 가지 수준 에서이 오류가 발생한다는 것을 알았습니다. 왜 그런지 잘 모르면 더 조사해야합니다. 예를 들어 앱이이 경로에 /admin/advertiser있는 경우 /adminIIS 사이트에 가상 디렉터리 가 없으면 오류가 나타납니다 .

내가 한 것은 admin.../intepub/wwwroot오류에 빈 디렉토리 가 생성 된 것 입니다.

위 단계를 수행 할 때까지 디버깅을 시작할 수 없습니다.

우리는 과거에 우리 팀에서이 문제를 겪었습니다. 기억하는 데 약간의 시간이 걸렸지 만, 이것이 우리가 전에 고 쳤던 방식과 정확히 같습니다.


1

나는 n'tier 아키텍처를 사용하고 있으며 같은 문제가 있지만 이것이 도움이됩니다. 먼저 같은이 connection string당신에 libraries당신처럼 DB를 액세스 할 수있는 app.config그리고 web.config 당신은 단순히 오버로드 된 생성자 .edmx (Model.context.cs) 파일을 추가 그 후 지금은 두 개의 생성자 하나는 기본 및 u는 방금 추가 다른 하나 (이다 가지고 과부하).

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

나는 EF와 함께 일하고 싶지 않은 수업 라이브러리를 가지고있었습니다. app.config (또는 connectionstring 섹션)를 클래스 라이브러리에서 exe 프로젝트로 복사 한 후 연결이 제대로 작동했습니다! 아마도 구성 파일은 exe 프로젝트와 동일한 폴더에 있어야하므로 찾을 수 없습니다. 따라서 클래스 라이브러리 프로젝트에서 구성 파일을 사용할 때는 항상주의하십시오!


0

글쎄 ...이 문제는 매우 단순한 (멍청한) 이유 일 수 있습니다 ... 다른 프로젝트에서 파일을 복사하고 EntityDataSource에서 ConnectionString을 변경하는 것을 잊었습니다 ... 프로젝트가 시작될 때 발생했습니다. 로그인 페이지에서 구성에 문제가 있다고 생각했지만 잘못된 연결 문자열 이름 (및 DefaultContainerName)이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.