2010-04-13 3 views
0

나의 현재 respository는 다음과 같이, 나는 현재 내가 제대로 질문을 이해한다면, 당신이 제안을 찾고 있습니다/delele/업데이트LINQ2SQL 데이터 영역/저장소 제안

namespace Lib.Repository 
{ 

    public class MotorRenewalDataRepository 
    { 
     public MotorRenewalDataRepository()   
     { 

     } 
     public MotorRenewalData GetByID(long id) 
     { 
      using(var _context=DatabaseFactory.Create(false)) 
      { 
       return _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == id).FirstOrDefault(); 
      } 
     } 
     public MotorRenewalData Insert(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(false)) 
      { 
       _context.MotorRenewalDatas.InsertOnSubmit(entity); 
       _context.SubmitChanges(); 
       return entity; 
      } 
     } 
     public void Update(MotorRenewalData entity) 
     { 
      using (var _context = DatabaseFactory.Create(true)) 
      { 
       var dbEntity = _context.MotorRenewalDatas.Where(p => p.MotorRenewalDataID == entity.MotorRenewalDataID) 
          .FirstOrDefault();     
       Common.CopyObject<MotorRenewalData>(entity, dbEntity); 
       _context.SubmitChanges(); 

      } 

     } 

    } 
} 
+0

무엇이 문제입니까? – SteadyEddi

답변

0

삽입 당 LINQ2SQL 데이터 컨텍스트를 사용하고, 제안 해주십시오입니다 저장소 패턴을 올바르게 구현하는 방법에 대해 설명합니다. 다음은 저장소 패턴을 사용하는 좋은 방법입니다. 먼저 저장소의 인터페이스를 만들고 싶을 것이다. 여기서 저장소가 수행 할 수있는 작업을 정의합니다.

public interface IRepository<T> 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Save(); 
    IQueryable<T> FindAll(); 
} 

다음으로 개별 리포지토리를 만들 수 있습니다. 가장 먼저해야 할 일은 당신이하고있는 일반 저장소 외부의 인터페이스를 생성하는 것입니다.

public interface IMotorRenewalRepository : IRepository<MotorRenewal> 
{ 
    MotorRenewal FindMotorRenewalById(int id); 
} 

그리고 당신은 당신이 IMotorRenewalRepository에서 정의한 IRepository에 이르기까지 모든 것을 얻을 수 있도록하는 인터페이스는 MotorRenewal의 IRepository을 구현합니다. 인터페이스는 가짜 객체와 저장소의 단위 테스트를 작성할 때 일종의 의존성 주입을 사용해야하는 경우에 가장 일반적으로 사용됩니다.

이제 MotorRenewalRepository를 작성하고 IMotorRenewalRepository를 구현하십시오.

public class MotorRenewalRepository : IMotorRenewalRepository 
{ 
    MyDataContext _dataContext = new MyDataContext(); 

    public void Add(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.InsertOnSubmit(motorRenewal); 
    } 

    public void Delete(MotorRenewal motorRenewal) 
    { 
     _dataContext.MotorRenewals.DeleteOnSubmit(motorRenewal); 
    } 

    public void Save() 
    { 
     _dataContext.SubmitChanges(); 
    } 

    public IQueryable<MotorRenewal> FindAll() 
    { 
     return _dataContext.MotorRenewals.AsQueryable(); 
    } 

    public User FindMotorRenewalById(int id) 
    { 
     return _dataContext.MotorRenewals.Where(p => p.MotorRenewalDataID == id).SingleOrDefault(); 
    } 
} 

이 구현은 훨씬 이해하기 쉽습니다. 업데이트가 필요 없음을주의하십시오. 업데이트는 실제로 저장소에서 MotorRenewal 객체를 가져 와서 편집하고 .Save()를 호출하는 것입니다.

리포지토리에서 메서드를 호출 할 때마다 새 변수를 만드는 대신 데이터 컨텍스트에 클래스 수준 변수를 사용할 수 있습니다. MyDataContext는 데이터 연결에서 LinqToSql 클래스를 드래그 할 때 만든 모델에서 가져온 것이어야합니다.

+0

@MindlessProgrammer DataContext 재사용에 대한 swhook의 제안과 관련하여 DataContext 수명 관리에 대한 Rick Strahl의 게시물 (http://www.west-wind.com/weblog/posts/246222.aspx)을 참조하십시오. 나는 우리가 당신이 새로운'DataContext'를 생성하고 있다고 가정하고 있지만 사실 캐시 된 인스턴스를 리턴 할 수도 있습니다. 이 경우,'Create()'메소드의 이름을'Get()'과 같은 것으로 변경하여 의미를보다 정확하게 만들 것을 권장합니다. – Jay

+0

@swhook @Jay 인터페이스를 만들고 구현하는 방법을 알고 있습니다. 신경 쓰지는 않습니다. 구조화 된 코드가 필요합니다. 내가 정말로 알고 싶은 건 DatabaseFactory.Create (useObjectTracking)가 새로운 datacontext 인스턴스를 다시 불러오고 있다는 것입니다. datacontext를 만들고 개체를 uppdate하면 ​​개체 추적과 함께 변경 사항을 제출할 수 있습니다. 그러나이 저장소 Lib은 공유됩니다. webservices, 웹 애플 리케이션, Mutlithreaded winform 애플 리케이션, 나는 일반적으로 개체 추적 문제가 실행되므로 개체 추적없이 할 오전, 그것은 좋은 연습인가요? – MindlessProgrammer