2009-09-04 4 views
0

모든 linq2sql 클래스에서 기본 메서드를 수행하는 일반 저장소를 작성하려고합니다. (getById, insert, delete, getAll)linqtosql 클래스의 일반 저장소에 대한 도움말

이 작업을 수행하는 방법에 대해 잘 모르겠습니다. Heres 내가 지금까지 가지고있는 것은 ... getById 메소드는 Id 속성을 'T'클래스와 관련시킬 수 없으므로 오류를 발생시킵니다. 나는 (Id 속성이없는)이 객체로 형 T의 모든 인스턴스를 처리합니다 저장소 클래스 내부에서이 제네릭 클래스 개념의 주위에

public class Repository<T> where T:class 
{ 
    private ClassesDataContext db = new ClassesDataContext(); 


public IQueryable<T> getAll() 
{ 
    return db.GetTable<T>(); 
} 
public T getById(int id) 
{ 
    db.GetTable<T>().Where(e=>e.Id==id); 
    return db.GetTable<T>().Single(c =>c.Id==id); 
}} 

답변

0

을 내 머리를 정리하는 방법에 대한 몇 가지 포인터를 부탁드립니다.

는이 같은 기본 엔티티 클래스를 만들 수있는 몇 가지 일반적인 지원하도록하려면 :

public abstract class EntityBase 
{ 
    public int Id {get; private set; } 
} 

을 그리고 저장소가이 클래스에서 상속 사용하는 모든 개체를 확인합니다.

그런 다음 대신 하나의 당신이있는 곳을 포함하는 저장소 클래스 정의 업데이트해야합니다

:

public class Repository<T> where T: EntityBase 

이 당신의 저장소 방법 내부 형 T의 모든 인스턴스를 수는 EntityBase로 취급합니다 Id 메서드를 정의합니다. 합니다 (getById 방법에 절은 어디) 형 T.

당신은 SQL 문자열을 구축하고 실행해야합니다

알고되지 않는 특성 becuase 항목을 검색 할 수

+0

헤이 ...하지만 난 내 컨트롤러 에 저장소를 인스턴스화하는 방법을 잘 모릅니다 리포지토리 companyrepository = 새 리포지토리 (); 오류가 발생합니다 – ignaciofuentes

+0

회사 클래스가 EntityBase 클래스에서 양식을 상속합니까? –

+0

아니요, Company 클래스가 디자이너와 함께 linqtosql 클래스로 자동 생성되었습니다.이 클래스를 상속 받아야한다면 병이 다른 접근 방식을 찾아야합니다. – ignaciofuentes

0

당신은 람 바어 식을 사용할 수 없습니다.

string query = "SELECT * FROM [SomeTable] WHERE [SomeColumn] = {0}"; 
return db.ExecuteQuery<T>(query, id).FirstOrDefault(); 

당신은 다음과 같은 사용하여 테이블 이름을 얻을 수있는 T 형식의 TABLENAME 및 PrimaryKeyName를 얻을 수있을 것이다 :

db.Mapping.GetTable(typeof(T)).TableName; 

당신이 사용하는 기본 키 열 목록을 얻을 수 있습니다 :

db..Mapping.GetTable(typeof(T)).RowType.IdentityMembers.Select(m => m.MappedName).ToArray(); 

각 저장소가 기본 클래스에서 벗어나는 것을 염두에두면 TableName과 PrimaryKey의 두 필드를 간단하게 설정할 수 있습니다.

Linq2Sql을위한 완전한 일반 DAL/저장소를 작성하는 작업이 많습니다. 그것은 분리 된 엔티티에 대한 일반적인 Save, Update 메소드를 만드는 "재미"를 실제로 얻습니다.

-Douglas H.

+0

아, 내 실수. 나는 당신이 당신의 데이터베이스를위한 특정 DataContext를 생성하고 있다는 것을 깨닫지 못했다.난 당신이 일반적인 DataContext 클래스를 만드는 줄 알았는데. Jirapong은 그 때 정확하다. – Douglas

관련 문제