2011-03-13 3 views
6

정기적으로 Linq To SQL 클래스를 새로 고쳐야합니다. 네, 내 데이터 스키마에 대해 철저히 생각하지 않아서 부끄러워합니다. 나쁜 개발자, 광고 nauseum. SQLMetal이 거의 속임수라는 것을 알았지 만 매개 변수 목록에서 뭔가 빠졌습니다. SQLMetal은 클래스를 생성하지만 매개 변수없는 생성자는 생성하지 않습니다.

내가 비주얼 스튜디오 외부 도구를 사용하여 내 빛나는 새로운 도구 모음 단추에서 내 배치 파일을 실행

,

@echo off 
del c:\path\to\LinqToSql.dbml 
SQLMetal.exe /server:SERVER\SQLSERVER /database:db /timeout:0 /dbml:"c:\path\to\LinqToSql.dbml" /namespace:DAL /context:DataDataContext /entitybase:System.Data.Linq.DataContext /language:csharp /pluralize 

SqlMetal은 만세의하면 .dbml 파일을 생성합니다. 그러나 질문 1 프로그래밍 방식으로 .dbml 파일을 프로젝트에 포함 할 수 있습니까?

질문 2

왜, 내가 할 후 수동으로 새로 생성하면 .dbml 파일을 포함하여 컴파일 할 때 내 각 클래스 가지고있는 자신의 매개 변수가없는 생성자의 행 번호와 관련된 오류를 구축 다음? 예 : 30 테이블 = 30 빌드 오류.

'System.Data.Linq.DataContext' does not contain a constructor that takes 0 arguments 

DataDataContext 생성 된 클래스는 매개 변수없는 생성자가없는 예고, 그래서 보완 할 부분 클래스를 추가,하지만 여전히 트릭을하지 않는 한 실제

.
public partial class DataDataContext 
{ 
    public DataDataContext() : 
     base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource) 
    { 
     OnCreated(); 
    } 
} 

나는이 새로 고침 프로세스를 자동화 할 수 있지만, 수동으로 나를 위해 작동하지 않습니다이 생성자 오류를 생성하는 생성하면 .dbml 파일을 추가 거라 생각 했어요.

+0

추가 된 bounty. OP Designer를 문제없이 사용했지만 SQL Compact로 작업하고 SQLMetal을 거치면서 많은 사람들이 매개 변수가없는 생성자를 생성하는 방법을 알고 싶어합니다. – aevanko

답변

0

매개 변수없는 생성자를 만들기 위해 부분 클래스를 사용하며 (아무렇지도 않게) 문제가 없습니다.

DAL 네임 스페이스에 만들었습니다. (위 코드에서 누락되었습니다.)

namespace DAL { 
    public partial class DataDataContext 
    { 
     public DataDataContext() : 
      base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource) 
     { 
      OnCreated(); 
     } 
    } 
} 
0

1) .dbml 파일이 정말로 필요합니까? 어쩌면 당신은 직접이 같은 뭔가 필요한 ORM 파일을 생성 (그리고 솔루션에 포함되어 있습니다) 수 :

SQLMetal.exe /server:SERVER\SQLSERVER /database:DB /namespace:DAL /code:YourDatamapClass.cs /language:csharp 

그런 다음 배치 파일은 아마 솔루션 폴더에 (올바른 장소로 지금 새로 클래스를 이동하기).

2) 매개 변수없는 생성자가 실제로 필요합니까? 예를 들어, 설정 파일에 DB 연결 문자열을 넣어 함께 매퍼 객체를 생성 :

//GetConnectionString (not included here) gets the connection string from config 
DB context = new DB(GetConnectionString()); 
3

짧은 대답은 SQLMetal이 매개 변수가없는 생성자를하지 않는다는 것입니다. 관심의

namespace DAL { 
    public partial class DataDataContext 
    { 
     public DataDataContext() : 
      this(/* Get your connection string here */) 
     { 
      OnCreated(); 
     } 
    } 
} 

포인트 : 대답 나머지는 부분 클래스가 작동해야하지만 그것은 다음과 같이해야한다는 것입니다

  • 호출되도록이 (String) 생성자 대신 기지
    원하는 경우 OnCreated 이벤트를 올바르게 연결할 수 있습니다.
  • 당신이 원하는 그러나 연결 문자열을 얻기 - 간단한 방법은

    ConfigurationManager.ConnectionStrings 것 [ "MyConnectionSTring"]

가의 app.config에 다음과 결합 ConnectionString을 :

.
<connectionStrings> 
    <add 
     name="MyConnectionSTring" 
     connectionString="Data Source=SQLServerName\instance;Initial Catalog=DatabaseName;Persist Security Info=True;User ID=user" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
+0

고마워,이게 내가 필요한 전부 야. SQLMetal을 설정하는 방법을 알고 있었고, 생성자에 전체 시간을 넣는 대신에 app/web.config에서 연결 문자열을 가져 오는 재정의 생성자가 필요했다. – Pierre

관련 문제