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

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



답변

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



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


답변

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


답변

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

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

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


답변

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

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

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

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

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


답변

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

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

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

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


답변

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에 연결 문자열 정보를 복사 할 필요가 없습니다.


답변

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

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

대신에

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