애플리케이션 구성 파일에서 'MyEntities'라는 연결 문자열을 찾을 수 없습니다.


246

엔터티 프레임 워크와 ASP.NET MVC 4를 사용하여 응용 프로그램을 작성하고 있습니다.

내 솔루션은 두 개의 프로젝트로 나뉩니다.

  • 내 데이터 모델 (.edmx) 파일과 몇 가지 사용자 정의 인터페이스가 포함 된 클래스 라이브러리
  • 위의 클래스 라이브러리를 참조하는 '컨테이너'MVC 프로젝트

내 문제는 'MyEntites'DbContext를 사용하려고 하면 다음 오류가 발생 한다는 것입니다.

애플리케이션 구성 파일에서 'MyEntities'라는 연결 문자열을 찾을 수 없습니다.

문제는 연결 문자열이 MVC 프로젝트가 아닌 클래스 라이브러리의 app.config 내에 있다는 사실과 관련이 있다고 생각합니다.

누구든지 제안이 있습니까?


15
귀하와 정확히 동일한 컨텍스트 (EF6을 사용한 자동 마이그레이션)는 아니지만 TFS에서 하위 분기를 작성하고 작업을 시작할 때 유사한 오류 메시지와 동일한 문제가 발생했습니다. mvc 프로젝트를 시작 프로젝트로 표시하면 문제가 해결되었습니다. 출력 PM> Update-Database -Verbose Using StartUp project 'xxxxx.Web.Home'. Using NuGet project 'xxxxx.Web.Home.Dal'. Specify the '-Verbose' flag to view the SQL statements being applied to the target database. Target database is: 'MovieDatabase-0.0.2' (DataSource: (LocalDb)\v11.0, Provider: System.Data.SqlClient, Origin: Configuration).
기계적인 객체

답변:


309

연결 문자열을 MVC 프로젝트의 .config 파일로 복사하십시오.


63
완벽하게 작동하지만 참조 된 프로젝트가 자체 구성 파일을 사용하여 연결 문자열을 가져 오는 이유를 알고 싶습니다.
널 머리

7
@Alexander Old question 그러나 네, 왜 그런지 알고 싶습니다.
Kehlan Krumme 2016 년

22
@Alexander, 프레임 워크는 실행중인 어셈블리에 대한 구성 파일을로드하고 사용합니다. 이 경우 웹 프로젝트입니다. 클래스 라이브러리에는 일반적으로 자체 구성 파일이 없습니다.
kiprainey

24
NuGet COnsole의 컨텍스트에서 실행될 때 Enable-Migration 명령은 시작 프로젝트 구성 파일을 확인합니다. 반드시 필요한 프로젝트 일 필요는 없습니다. 시작하려는 app.config로 프로젝트를 설정하기 만하면됩니다. 계획. 선택적으로 연결 문자열을 하나의 구성 파일에 저장 한 다음 <connectionString configSource = "../ ProjectDir / SharedConnections.config"/>를 통해 다른 프로젝트에서 참조하십시오.
Ryan Mann

3
이 정확한 오류 메시지가 표시되었지만 올바른 프로젝트의 .config 파일에 실제로 올바른 연결 문자열이 나열되어 있습니다. 그러나 변환을 사용하고 있었으며 물론 변환 된 .config-file에서 connection-string이 참조되지 않았습니다. 구성 파일 변환을 사용하는 경우 살펴 봐야 할 사항입니다.
Morten Nørgaard

143

그렇습니다. 클래스 라이브러리 (.edmx 파일)가 시작 / 주 프로젝트가 아니기 때문입니다.

연결 문자열을 기본 프로젝트 구성 파일에 복사해야합니다.

시작 / 기본 프로젝트에 구성 파일이없는 경우 (내 콘솔 응용 프로그램의 경우와 같이) 하나만 추가하십시오 (시작 프로젝트-새 항목 추가-> 응용 프로그램 구성 파일).

더 관련 정보는 여기에서 찾을 수 있습니다 : MetadataException : 지정된 메타 데이터 리소스를로드 할 수 없습니다


8
이에 대한 주요 대답은 클래스 라이브러리 (.edmx 파일이있는)가 STARTUP 프로젝트가 아니라는 것입니다. 시작 프로젝트가 web.config가있는 프로젝트로 설정되지 않았다는 것을 깨달았습니다. 다른 app.config를 가진 콘솔 앱이었습니다. 따라서 웹 응용 프로그램에 콘솔 응용 프로그램을 추가하는 경우 update-database를 실행할 때 웹 프로젝트가 시작 프로젝트인지 확인하십시오!
Karl

1
어떤 이유로 메인 프로젝트를 언로드했으며 다시로드 한 후 마이그레이션을 추가하려고하는 동안이 오류가 발생했습니다. 메인 프로젝트 시작 프로젝트를 다시 만들면 문제가 해결되었습니다. 감사합니다 @Oren
Azadrum

2
내 시작 프로젝트가 실수로 변경되었습니다. 이것이 핵심입니다. 당신의 대답은 정말로 도움이되었습니다!
Fabio Milheiro

98

DbContext를 사용하여 프로젝트를 시작으로 설정하십시오.

프로젝트를 마우스 오른쪽 버튼으로 클릭하고 선택하십시오.

또는

app.config (또는 web.config)에서 연결 문자열이 시작되도록 설정된 프로젝트에 추가

또는

이런 식으로 명령을 호출

Update-Database -Script -ProjectName '<project name>' -StartupProjectName '<project name>' -ConnectionString 'data source=.;initial catalog=<db name>;integrated security=True;MultipleActiveResultSets=True' -ConnectionProviderName 'System.Data.SqlClient'

그런 다음 다시 시도하십시오


2
실제로 프로젝트에는 연결 문자열이 포함되어 시작 프로젝트로 설정되어야하며 일반적으로 DbContext 파일이있는 프로젝트가 아닙니다.
Raymond Wang

1
... 따라서 패키지 관리자가 올바른 레이어를 대상으로하는 것 외에도 Set as Startup Project위에 표시된 스크린 샷에 따라 동일한 레이어가 필요합니다 . (F5를 누르더라도 클래스 라이브러리를 시작할 수는 없습니다.)
bkwdesign

3
이것은 내 생명을 구했습니다. 패키지 관리자에서 기본 프로젝트가 컨텍스트가 설정된 프로젝트로 설정되었지만 여전히 재정의하지 않았습니다.
garfbradaz

1
"그러나 그것은 어제 일했다! 똑같은 명령 !" => 이것!
Simon_Weaver

1
가장 쉬운 방법 =)
Alexandr

29

연결 문자열을 전달하고 EntityFramework인생을 시작할 수 있습니다.

public partial class UtilityContext : DbContext
{
    static UtilityContext()
    {
        Database.SetInitializer<UtilityContext>(null);
    }

    public UtilityContext()
        : base("Data Source=SERVER;Initial Catalog=DATABASE;Persist Security Info=True;User ID=USERNAME;Password=PASSWORD;MultipleActiveResultSets=True")
    {
    }

    // DbSet, OnModelCreating, etc...
}

시작 프로젝트가 갑자기 구성 파일 찾기를 중단 한 이유에 대한 해결책을 찾지 못해 하루를 보냈습니다. 내 app.config 및 <appname> .exe.config가 시작 프로젝트 저장소에 표시되었지만 EntityFramework에서 영원히 사용했던 연결 문자열을 찾을 수 없습니다. 나는 최근에 솔루션에서 사용하지 않는 많은 프로젝트를 제거했으며 그와 관련이 있는지 궁금합니다. 솔루션에서 웹 프로젝트를 제거했습니다. 내 다른 프로젝트가 web.config 또는 이와 유사한 것이 아닌지 궁금합니다.
GrayDwarf

실행중인 프로젝트의 구성은 다른 모든 하위 프로젝트에서 사용됩니다.
Serj Sagan

1
그러나 공급자 이름을 설정하는 방법?
FizxMike

9

예상 한대로, 클래스 라이브러리의 app.config에있는 연결 문자열과 관련이 있습니다.

app.config 클래스에서 컨테이너 app.config또는 web.config파일로 항목을 복사 하십시오.


8

솔루션에 여러 프로젝트가있는 경우 진실 App.config가있는 곳에서 프로젝트를 시작으로 설정하십시오.


7

"프로젝트로 설정"으로 설정된 프로젝트에 연결 문자열 app.config또는 web.config파일 을 복사 StartUp하고 데이터 계층 프로젝트에서 엔티티 프레임 워크를 사용하는 경우 주 프로젝트에 엔티티 프레임 워크 너겟 을 설치하십시오 .


4

시작 프로젝트가 변경 한로 하지 않는연결 문자열을 .

  1. 마우스 오른쪽 버튼 클릭 솔루션-속성 클릭
  2. 공통 특성에서 시작 프로젝트를 선택하십시오.
  3. 오른쪽 창에서 연결 문자열이있는 프로젝트를 선택하십시오 (대부분의 경우 MVC 프로젝트-솔루션을 시작하는 프로젝트)

예, 작동합니다. EF가 DB와 통신하기 위해 클래스 라이브러리를 만들었고 같은 문제가 발생했습니다.
Satinder Sidhu

4
  1. App.Config 파일 추가
  2. 프로젝트를 시작 프로젝트로 설정하십시오.
  3. entityFramework섹션 뒤에 연결 문자열을 추가해야합니다 .

    <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    
    </configSections>
    
    <connectionStrings>
       <!-- your connection string goes here, after configSection -->
    </connectionString>

3

그래, 바보 야 연결 작성기를 사용하여 연결 문자열을 복사하지 않아도됩니다. serverName 변수, databaseName 변수가있는 VB.Net 코드 (제작에 사용되었지만 여기에서 약간 수정되었으므로 테스트되지 않은 문제로 처리하십시오). 나를 위해 :

    Dim EfBuilder As New System.Data.EntityClient.EntityConnectionStringBuilder("metadata=res://*/VMware.VmEf.csdl|res://*/VMware.VmEf.ssdl|res://*/VMware.VmEf.msl;provider=System.Data.SqlClient;provider connection string=""data source=none;initial catalog=none;integrated security=True;multipleactiveresultsets=True;App=EntityFramework""")
   Dim SqlBuilder As New Data.SqlClient.SqlConnectionStringBuilder(EfBuilder.ProviderConnectionString)
                        SqlBuilder.DataSource = serverName
                        SqlBuilder.InitialCatalog = databaseName
                        EfBuilder.ProviderConnectionString = SqlBuilder.ConnectionString
                        Using vmCtx As New VmEfConn(EfBuilder.ConnectionString)

2

솔루션에서 둘 이상의 프로젝트를 사용하고 있습니까?

당신이 있다면, 당신이 확인 해야하는 웹 설정은 de .edmx 파일과 동일한 프로젝트에있는 것이므로


그렇습니다. 연결 문자열을 포함하는 프로젝트는 App.config 파일 만 포함하는 클래스 라이브러리입니다. MVC 프로젝트는이 문제를 확인하지 않는 것 같습니다.
jjc99

개발하는 동안 프로젝트에 app.config 만 표시 할 수 있습니다.
Diego

답장을 보내 주셔서 감사합니다. edmx 파일이 포함 된 프로젝트에서 연결 문자열을 복사하여 MVC 프로젝트의 루트 web.config 파일에 배치하려고했습니다. 불행히도 여전히 연결 문자열을 찾을 수 없습니다. 어떤 식 으로든 연결 문자열을 수정해야합니까?
jjc99

그것의 다른 길. 개발 시간에 .edmx 파일이있는 프로젝트의 app.cofnig에 con 문자열이 필요합니다. 당신이 그것을 가지고 있다면 이름이 잘못되었을 수 있습니다. 연결 문자열의 이름은 .edmx 파일의 "엔티티 포함 자 이름"속성과 같아야합니다.
Diego


1

EntityFramework 프로젝트에 web.config 및 app.config로 시작 proyect 인 여러 proyects를 사용할 때이 문제가 발생했습니다.

이 문제를 피하려면 다음을 수행해야합니다.

  1. 시작된 * .config 파일에 연결 문자열이 필요합니다.
  2. EntityFramework DLL을 참조에 설치해야합니다.

1

나는 같은 문제에 직면했다. 다른 레이어에서 데이터 액세스 작업을 수행 할 때 연결 문자열을 시작 프로젝트에 넣지 못했습니다. 또한 시작 프로젝트에 app.config가 없으면 app.config 파일을 추가 한 다음 해당 구성 파일에 연결 문자열을 추가하십시오.


1
감사합니다. 프로젝트로드에 문제가있어서 "시작 프로젝트"가 손실되었습니다. 귀하의 답변에 따라 컨텍스트 파일과 app.config가있는 프로젝트가 시작임을 확인했습니다.
Mastro

1

다른 답변에서 알 수 있듯이 프로젝트를 시작으로 설정하지 않아서 얻었습니다. 이것에 대한 나의 기여-Add-Migrations 및 Update-Database를 수행 할 때 Nuget Package Manager Console에서 명령의 일부로 시작 프로젝트를 지정하십시오 ( '['또는 ']'문자는 포함하지 마십시오. 거기에있는 텍스트를 프로젝트 이름으로 변경해야합니다) :

  1. 인 에이블
  2. 추가 마이그레이션 -StartupProject [데이터 컨텍스트 클래스를 포함하는 프로젝트 이름]
  3. Update-Database -StartupProject [위와 동일한 프로젝트 이름]

그렇게해야합니다.


이 방법으로 프로 시저에 명령을 포함시킬 수 있으며 시작 프로젝트를 기본값에서 계속 변경하지 않아도됩니다.
JakeJ

1

컨텍스트 클래스가 DbContext에서 상속되기 때문입니다. 귀하의 ctor는 다음과 같습니다.

public MyEntities()
    : base("name=MyEntities")

name=... connectionString의 이름으로 변경해야합니다


0

.edmx 파일을 포함하는 프로젝트에 의해 생성 된 연결 문자열은 연결 문자열을 생성합니다. 이는 출력 디렉토리로 복사되고 실행 파일이 런타임 구성 정보를 저장하기 위해 참조하는 app.config 파일에서 보류 된 것으로 보입니다.

웹 프로젝트의 web.config 파일에 임의의 .config 정보를 추가하는 자동 프로세스가 없으므로 웹 프로젝트가 중단됩니다.

연결 문자열을 구성 파일에서 web.config 파일의 연결 섹션으로 복사하고 구성 파일 내용을 무시하는 것이 가장 쉽습니다.


0

방금이 문제를 해결하는 가장 좋은 방법은 해당 프로젝트 (대부분 클래스 라이브러리)를 시작 프로젝트로 임시 설정하는 것입니다. 이렇게하면 패키지 관리자 콘솔이 해당 프로젝트를 구성 소스로 사용하도록합니다. 이러한 방식으로 설정되는 이유 중 일부는 econfig 파일이 일반적으로 따르는 하향식 모델 때문입니다. 일반적으로 클라이언트와 가장 가까운 프로젝트 (예 : MVC 응용 프로그램)는 사용할 web.config 또는 app.config입니다.


0

시작 프로젝트의 ROOT web.config에 연결 문자열을 배치했는지 확인하십시오.

나는 분명히 여기에 명백한 것을 알고 있지만 나에게도 일어났다. 그러나 MVC 프로젝트의 Web.Config (.edmx 파일이 다른 클래스 라이브러리 프로젝트에 배치되어 있음)에 연결 문자열이 이미 있었지만 나는 할 수 없었다. 왜 계속 예외가 발생하는지 알지 못합니다 ... 긴 이야기로, 연결 문자열을 실수로 Views \ Web.Config에 실수로, 피곤함과 아래로 스크롤하지 않는 이상한 조합으로 복사했습니다. 솔루션 탐색기 시나리오. 예, 베테랑 개발자에게도 이런 일이 발생합니다. :)


0

이 문제는 프로젝트에서 레이어를 사용하고 DataLayer에서 엔티티 프레임 작업을 정의 또는 설치하고 프로젝트를 실행하려고 할 때 발생합니다.

따라서이 문제를 해결하려면 Edmx 파일이있는 레이어에서 연결 문자열을 복사하고 연결 문자열을 기본 web.config에 붙여 넣습니다.


0

다음과 같이 클래스 라이브러리를 참조하는 'container'MVC 프로젝트의 루트 web.config 파일에 연결 문자열을 추가하십시오.

 <connectionStrings>

  <add name="MyEntities" connectionString="complete connection string here" providerName="System.Data.SqlClient" />

  </connectionStrings>

"MyEntities"를 연결 이름으로 사용하지 않으려면 원하는대로 변경하고 MyEntities DbContext 클래스에서 다음을 변경하십시오.

MyEntities: DbContext
 {
   public MyEntities():base("Name-Of-connection-string-you wish to connect"){ }
 }

이 오류의 원인은 연결 문자열의 이름을 지정하지 않거나 DbConext의 파생 클래스에서 문자열을 연결하면 (귀하의 경우 MyEntities) DbContext는 루트 web.config 파일에서 연결 문자열을 자동으로 검색합니다. 파생 클래스 이름과 동일합니다 (귀하의 경우 내 엔터티).


0

MSTest를 실행할 때이 문제가 발생했습니다. "noisolation"플래그없이 작동하지 못했습니다.

잘하면 이것은 누군가를 돕는다. 그것을 알아낼 시간이 많이 걸렸습니다. IDE에서 모든 것이 잘 작동했습니다. 이 맥락에서 Entity Framework에 이상한 점이 있습니다.


0

정기 마이그레이션

두 가지 옵션이 있습니다. 여기에서 모두가 제안한 첫 번째 옵션은 연결 문자열이 프로젝트의 Web.config 파일에 있는지 확인하는 것입니다. Azure 응용 프로그램 설정에서 연결 문자열로 작업 할 때는 Web.config 값을 Azure 값으로 덮어 씁니다.

Azure 또는 자동 마이그레이션 (프로그래밍 방식)

프로그래밍 방식으로 마이그레이션을 실행중인 경우 Web.config에 저장하지 않고 동적으로 (또는 Azure 응용 프로그램 설정을 통해) 얻은 연결 문자열을 사용하여 마이그레이션을 실행할 수있는 두 번째 옵션이 있습니다.

구성의 TargetDatabase를 설정할 때는 연결 이름 만 사용하는 생성자 대신 연결 문자열과 공급자 이름을 사용하는 DbConnectionInfo 생성자를 사용하십시오 . 연결 문자열에 공급자 이름이없고 SQL Server / Azure SQL을 사용하는 경우 "System.Data.SqlClient" 를 사용하십시오.


0

이로 인해 호출 코드에서 충분한 dll 참조가 참조되지 않을 수도 있습니다. 작은 서투른 해킹으로 하루를 구할 수 있습니다.

DB First 접근 방식을 따르고 DAL 클래스 라이브러리 프로젝트에서 EDMX 파일을 작성했으며, 이는 WAL 서비스에서 참조한 BAL 클래스 라이브러리에 대한 참조였습니다.

BAL 에서이 오류가 발생했기 때문에 위에서 언급 한 방법을 사용하여 DAL 프로젝트의 App.config에서 구성 세부 정보를 복사했지만 해결되지 않았습니다. 궁극적으로 친구의 팁으로 WCF 프로젝트에 더미 EDMX 파일을 추가했기 때문에 (관련 DB 연결 등) 필요한 모든 것을 가져온 다음 EDMX 파일을 삭제하고 문제가 해결되었습니다. 깨끗한 빌드.


0

@RyanMann 의 최고 답변 에 다음과 같은 의견이 있습니다 .

연결 문자열을 하나의 구성 파일에 저장 한 다음 다른 프로젝트에서 연결 문자열을 참조하십시오. <connectionString configSource="../ProjectDir/SharedConnections.config" />

이것은 환상적인 제안입니다!

또한 App.config와 Web.config 파일간에 연결 문자열을 공유하도록 작동합니다!

이 제안을 따르고 싶은 사람은 이 SO 답변 으로 넘어 가야합니다. . 솔루션의 여러 프로젝트간에 연결 문자열을 공유하는 방법에 대한 단계별 가이드가 있습니다.

유일한 경고는 configSource동일한 디렉토리 또는 하위 디렉토리에 존재 해야한다는 것입니다 . 위의 링크는 "링크로 추가"를 사용하여이 문제를 해결하는 방법을 설명합니다.


0

AutoCAD 플러그인 내에서 EF를 사용하려고 할 때이 오류가 발생했습니다. CAD 플러그인은 acad.exe.config 파일에서 연결 문자열을 가져옵니다. 위에서 언급 한대로 연결 문자열을 acad 구성 파일에 추가하면 작동합니다.

크레딧은 ADN.Network에서 Norman.Yuan으로갑니다.


0

MVVM 모델을 사용하는 경우 연결 문자열을 프로젝트의 모든 부분에 복사하십시오.

예를 들어, 솔루션에 클래스 라이브러리 프로젝트와 wpf 프로젝트라는 두 개의 프로젝트가 포함 된 경우 백엔드 프로젝트 (라이브러리 클래스 porject)의 연결 문자열을 복사하고 wpf 프로젝트의 App.config 파일에 사본을 배치해야합니다.

<connectionStrings>
  <add name="DBEntities" ... />
</connectionStrings>

그것이 당신에게 도움이되기를 바랍니다 :)


-2

web.config 파일에 Connectoinstrnig 추가

<ConnectionStiring> <add name="dbName" Connectionstring=" include provider name too"  ></ConnectionStiring>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.