2013-10-08 2 views
0

현재 .NET의 일부 데이터베이스 형식을 사용하는 응용 프로그램을 배포하려고합니다. SQL Server Express 또는 SQL Server Express LocalDB를 사용하려고합니다.attachdbfilename 값이 올바르지 않습니다.

데이터베이스에 액세스하기 위해 엔티티 프레임 워크를 사용하고 있습니다.

이제 목표는 손으로 SQL 서버의 모든 변경을 요구하지 않는 배포 버전을 만드는 것입니다. 응용 프로그램을 시작하는 데 필요한만큼 설치 및 설정해야합니다. 모든 개발 컴퓨터에서 잘됩니다. 어떻게 한 번 다른 컴퓨터에 배포하면 문제가 시작됩니다.

나는 대상 시스템에 설치를 손으로 데이터베이스 구조를 요구 사항을 방지하기 위해 LocalDB를 시도했다. 응용 프로그램을 시작하면 연결 문자열에 문제가 있음을 언제까지보고합니다. attachdbfilename이 유효하지 않습니다. 내가 말했듯이

이 파일 이름 attachdbfilename=|DataDirectory|\database\Db.mdf 로 설정됩니다. 내 발달에 maschine이 작동합니다. 배포 된 파일을 사용할 때와 IDE에서 실행할 때 모두. 그러나 목표 mashine은 문제를보고합니다. 내 응용 프로그램과 함께 ClickOnce를 사용하여 SQL Server Express 2012 LocalDB를 설치했습니다. 배포 된 파일에는 mdf 파일이 적절한 디렉토리에 있습니다.

전체 연결 문자열은 다음과 같습니다

<connectionStrings> 
    <add name="DbContainer" connectionString="metadata=res://*/database.DbModel.csdl|res://*/database.DbModel.ssdl|res://*/database.DbModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\database\Db.mdf;integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
</connectionStrings> 

내가 인 AttachDBFilename가 유효하지 않은 이유를보고 실패합니다. 대상 컴퓨터에 SQL Server를 설치할 수 있습니다.

은 또한 정상적인 SQL 서버 2012 익스프레스와 함께 pulish하려고 노력했다. 첨부 된 데이터베이스 파일을 사용하지 않고 이것을 사용하고 싶다면 수동으로 필요한 데이터베이스를 만들어야합니다. 그리고 그것은 옵션이 아닙니다. 이 엔티티 프레임 워크에 의해 생성되었다 것처럼

Public Partial Class DbContainer 
    Inherits ObjectContext 

    Public Sub New() 
     MyBase.New("name=DbContainer", "DbContainer") 
     MyBase.ContextOptions.LazyLoadingEnabled = true 
     OnContextCreated() 
    End Sub 

    Public Sub New(ByVal connectionString As String) 
     MyBase.New(connectionString, "DbContainer") 
     MyBase.ContextOptions.LazyLoadingEnabled = true 
     OnContextCreated() 
    End Sub 

    Public Sub New(ByVal connection As EntityConnection) 
     MyBase.New(connection, "DbContainer") 
     MyBase.ContextOptions.LazyLoadingEnabled = true 
     OnContextCreated() 
    End Sub 
    ... 

:

나는 이것이 ObjectContext 만들 그러나 이것은뿐만 아니라 좋은 찾고에 문제가 있음을 나타냅니다 몇 가지 질문을 읽어 보시기 바랍니다.

나는이 문제를 해결하는 방법에 대한 아이디어를 밖으로 실행하고 있습니다.

답변

0

좋아 문제가 밝혀졌다 내가 사용하지 않는 optained 적절한 한 번의 클릭으로 데이터 디렉토리 사용하여 손으로 연결 문자열에서이 항목을 대체 |DataDirectory|

:

Dim dataDir As String 
If ApplicationDeployment.IsNetworkDeployed Then 
    Dim ad = ApplicationDeployment.CurrentDeployment 
    dataDir = ad.DataDirectory 
Else 
    dataDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 
End If 

데이터베이스를로드 없음 문제 더 이상 파일. |DataDirectory|의 대체가 작동하지 않는 이유를 말할 수 없습니다. 개발 컴퓨터의 버전에서는 빈 문자열로 바꾸기 만하면됩니다.이 작업은 작업 디렉토리가 참조 된 데이터베이스 디렉토리의 부모이기 때문에 가능합니다.

어떻게 지금까지 데이터베이스를 포함하여 ClickOnce를에게 데이터 파일을 사용하는 경우, 다른 디렉토리에 있습니다. 이로 인해 연결 문자열이 실패합니다. 위의 코드는이 문제를 해결합니다. 나는 이것이 어떤 이유로 작동하지 않는지 설명 할 수 없다.

관련 문제