2011-01-05 5 views
2

이미 기본 클래스가 생성되었습니다. 2 : 1. DataContext 2. 테이블 개체 클래스LINQ to SQL 클래스를 사용할 때 도움이 필요

Now : 1. 데이터 클래스에 기능 (확장)을 추가하는 방법. 나는 분리 된 부분 클래스를 만들었다.

  1. 데이터 컨텍스트를 확장해야합니까?

  2. 내 생성자 생성자에서 generated-class 생성자를 호출해야합니까?

  3. 데이터 클래스의 새 인스턴스를 만드는 방법은 무엇입니까?

걱정되는 점은 DB 이름 (Databahn)과 (그 밖의 무엇을 알지 못합니다) dbml에 밀접하게 관련되어 있다는 것입니다. 앞으로 DB 이름 등을 변경하면 어떻게 될까요?

그리고 클래스 이름을 변경할 수 있습니까? DB 테이블 이름과 동일하지 않게하려면?

[global::System.Data.Linq.Mapping.DatabaseAttribute(Name="Databahn")]
public partial class AgentsDataContext : System.Data.Linq.DataContext

+1

'데이터 클래스에 기능 (확장) 추가'란 무엇을 의미합니까? 어떤 기능을 생각하고 있습니까? – Steven

+0

나는 (테이블에서 생성 된) 객체 클래스에 대한 비즈니스 로직을 의미한다. –

+1

또한 - VS2008SP1을 사용하는 경우 "MyDataContext.cs를 추가 할 때 생성 된 코드가 기화 됨"이라는 경고 (VS2010에서 수정 됨)를주의하십시오. 이것에 의해 타격을 받으면 해결 방법이 있습니다. –

답변

3

나는 일반적으로 손을 내 자신의 datacontexts 및 데이터 개체뿐만 아니라 Sql Linq에 대한 롤. 내 작은 집에서 만든 전략을 보여주기 위해 샘플 datacontext, table 객체 및 리트리버 메서드를 만들겠습니다. 우리는 데이터베이스 이름이 "Main"이라고 말하고, 테이블 객체는 SQL 내부에 "dbo.Person"이 될 것입니다.

은 간다 : 이제 마지막으로 PersonRetriever 클래스

[Table(Name = "dbo.Person")] 
internal class PersonDto 
{ 
    private Guid _id; 
    [Column(Storage = "_id", IsPrimaryKey = true)] 
    public Guid Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    private string _name; 
    [Column(Storage = "_name")] 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    private DateTime _dateCreated; 
    [Column(Storage = "_dateCreated")] 
    public DateTime DateCreated 
    { 
     get { return _dateCreated; } 
     set { _dateCreated = value; } 
    } 
} 

:

public class PersonRepository 
{ 
    private string _connectionString; 

    public PersonRepository(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    string GetPersonName(Guid personId) 
    { 
     using (var db = new MainDataContext(_connectionString)) 
     { 
      string personName = string.Empty; 

      PersonDto person = db.PersonDtos.FirstOrDefault(c => c.Id == personId); 

      if (person != null) 
      { 
       personName = person.Name; 
      } 

      return personName; 
     } 
    } 
} 

A ~ F를

internal class MainDataContext : System.Data.Linq.DataContext 
{ 
    private static MappingSource _mappingSource = new AttributeMappingSource(); 

    internal MainDataContext(string connectionString) 
      : base(connectionString, _mappingSource) {} 

    internal Table<PersonDto> PersonDtos { get { return GetTable<PersonDto>(); } } 
} 

DTO 내 테이블을 나타내는 :

DataContext를 내 databae를 나타내는 주의 사항 : 미리 컴파일 된 linq 쿼리를 수행 할 때 상태를 유지하기 위해서만 기본 데이터 컨텍스트에 전달하기 위해 datacontext에 정적 매핑 소스를 선언합니다. 필요하지 않습니다. 연결 문자열을받는 기본 생성자가 있습니다.

또한 Dtos를 선언 할 때 공용 속성 이름이 정확히 데이터베이스의 테이블과 일치하는지 확인하십시오. 비공개 멤버의 이름은 원하는대로 지정할 수 있습니다.

희망이 도움이됩니다.

+0

Dto 객체에 인터페이스를 명시 적으로 구현할 수도 있습니다. (PersonDto : IPerson). 그렇게하면 DB에서 검색 할 때 인터페이스를 반환 할 수 있으며 매핑을 만들 필요가 없습니다. 레이어 분리에 도움이됩니다. –

0

당신은 DBML/디자이너에서 유형 이름을 변경할 수 있습니다. 테이블 이름과 정확히 일치 할 필요는 없습니다.

생성자를 다시 작성하십시오. 기존의 다른 생성자에 연결하려면 생성자 선언 (본문 앞에 너트) 뒤에 :this(...) 구문을 사용할 수 있습니다.

아니요 : 부분 클래스 조각을 추가하는 경우 데이터 컨텍스트를 수정할 필요가 없습니다.

그냥 새로운 인스턴스를 만들려면 new을 사용하십시오. 이전과 동일한 유형입니다 (부분 클래스는 컴파일러에서 병합해야하는 여러 실제 파일에 대한 유형을 분할합니다).

데이터 컨텍스트의 DB 이름을 다시 입력하십시오. 런타임에 config에서 연결 세부 사항을 선택하는 것이 일반적이며,이 경우 무시됩니다.

+0

나는 내 질문을 분명히하지 않았다고 생각한다. :) 방금 간단한 테이블에 대한 자동 생성 코드를 많이 보았습니다. 이제는 클래스에 액세스하고, 객체를 만들고, DB에 간단히 저장하고 쿼리해야합니다. 그 끝에, 나는 linq 2 SQL을 생성 한 후 따라야 할 일반적인 패턴을 알고 싶었어요. 누구나 데이터 클래스와 어떻게 상호 작용합니까? 몇 가지 예는 매우 도움이 될 것입니다. –

+0

@Munish - 짧은 게시물에서 완전한 방식으로하기가 어렵습니다. MSDN 자료를 읽었습니까? 아니면 "LINQ in Action"인가? –

+1

나는 그렇게 생각한다. 여기에 모든 것을 넣기가 어렵습니다 :) 그래서 모든 tht를 자세히 읽어야합니다. 어쨌든 나는 너무 많은 테이블 (abt 10)을 가지고 있지 않다. 나는 단지 기존 툴을 이용하여 clases와 DAL을 생성하는 데 드는 시간을 절약하고 싶었다. 학습 곡선과 생소한 것을 감안할 때 ROI가 좋지 않을 수 있습니다. 나는이 ORM 도구가 주로 큰 DB를 위해,/ORM을 위해 사실일지도 모르지만 그들 자신/ –