0

저는 프로젝트를 코딩해야하는 방법과 저장소가 무엇인지 명확히 알기 위해 포럼과 저장소 패턴 블로그를 수색했습니다. 어떤 도움이나지도가 많이 approciated 될 것입니다 :)리포지토리 패턴이있는 MVC 스캐 폴딩 - 자식 객체를 트랜잭션으로 저장

내 프로젝트를 EF5 MVC4 면도기 코드 첫 번째로 시작하고 MVCScaffolding을 사용하여 모든 컨트롤러, 뷰 및 리포지토리를 생성하기로 결정했습니다. 이것은이 기술을 사용하는 첫 번째 프로젝트 였고, 팀이 지금 어떻게하고 있었는지에 대한 이야기를 들었습니다. (이전 개발자들은 모델을 먼저 작성하고 손으로 컨텍스트를 코딩했습니다.)

그래서, 우리는 많은 화면을 코딩하고 있지만, 우리 스크린 중 하나는 여러 모델/하위 모델 (예 :/객체 모델에 응답, 첨부, 검토 자 등에 대한 FK가있는 복잡한 하나입니다. ...). 사용자는 많은 데이터를 추가하고 하나 이상의 검토자를 선택하고 0 개 이상의 첨부 파일을 추가합니다. 그런 다음 그들은 Save를 누르십시오!

이제 큰 문제는이 모든 데이터를 하나의 트랜잭션으로 저장하고 자식 모델 (예 : 첨부 파일) 중 하나에서 오류가 발생하면 트랜잭션이 롤백된다는 것입니다. 그러나, MVCScaffolding 리포지토리가 생성되는 방식 인 각 모델에는 DB 컨텍스트의 자체 인스턴스가 있으며 자체 Save입니다. 그리고 컨트롤러는 화면 데이터를로드하기위한 매개 변수로 각 고유 저장소를 승인합니다. 주목할 것은 ViewModel을 사용하여 데이터를로드하는이 화면에 대한 것입니다. 그런 다음 저장을 위해 다른 모델로 다시 매핑 할 사용자 지정 매퍼를 작성했습니다. 우리는 개별적으로 각 조각을 저장할 수 있습니다. 아마도 솔루션은 저의 저장 주위에 TransactionScope를 래핑하는 것일뿐입니다.하지만 각 저장소 저장이 호출을 수행 할 때 db에 대한 호출 수를 줄이려고합니다.

내가 하나의 컨텍스트 개체에서 모든 자식 obejcts를 추가/편집 할 수있는 UnitsOfWork 형식의 저장을위한 부모 저장소에 코드를 추가 할 수 있다고 생각했지만이 코드는 무엇보다 해킹처럼 보였고 제대로 코딩하려고합니다. .

다른 프로젝트 중 하나가 여기에 사용자 지정 DB 컨텍스트를 만들고 모든 Save 메서드가 해당 클래스에 있었으므로이를 수행하는 가장 좋은 방법은 무엇입니까? 다른 개발자가 먼저 코드를 작성했지만 손으로 ​​모든 Save 메소드를 코딩했습니다. 그들 중 누구도 표준 장소에 있고 그가 DBContext 내부에있는 TransactionScope을 사용하고 있습니다 (과도 함이거나 DBContext가 트랜잭션을 처리하지 못합니까)?

저는이 문제에 익숙해 졌기 때문에 도움이 필요하며 함께 일하는 사람이 없기 때문에 적절한 방법에 동의하는 것 같습니다. 필자는 데이터베이스 무거운 사상가이기 때문에 "MVC App"에 대한 모델이 잘못되었는지 확실하지 않습니다.

다음은 내 모델의 샘플입니다. 모든 안내를 받으실 수 있습니다. 감사합니다 :)

public class Anomaly 
{ 
    [Key] 
    public int AnomalyId { get; set; } 

    public string Subject { get; set; } 

    public int PlantId { get; set; } 
    [ForeignKey("PlantId")] 
    public virtual Plant Plant { get; set; } 

    public DateTime? ReviewByDate { get; set; } 

    public virtual ICollection<AnomalyReviewer> AnomolyReviewers { get; set; } 
    public virtual ICollection<AnomalyAttachment> AnomalyAttachments { get; set; } 

} 

    public class AnomalyAttachment 
{ 
    [Key] 
    public int AnomalyAttachmentId { get; set; } 

    public int AnomalyId { get; set; } 
    [ForeignKey("AnomalyId")] 
    public virtual Anomaly Anomaly { get; set; } 

    public string FilePath { get; set; } 
    public string FileName { get; set; } 
    public string FileExtension { get; set; } 
    public string Notes { get; set; }   

} 

ps. 그것은 단지 샘플입니다 ... 감사합니다!

답변

1

그냥 컨트롤러에서 상속하는 클래스 '마스터'를 만드십시오. 그런 다음 공용 사용자 GetUserById (Int32 id)와 같이 모든 쿼리를 작성하십시오. 마지막으로 개인용 호출을 수행하는 함수를 작성하십시오 !! DbContext의 구현

나는 보통 그 함수에 SystemEvents의 enum을 줄 것이므로 뭔가 실패 할 경우 어떤 일이 발생했는지에 대한 참조를 얻었을 것이다. 물론 자신의 notificator 나 model을 작성해야한다. 개인 테스트를위한 데이터베이스 ...

필자는 모든 코드를 작성할 수 있기 때문에 실제로 저장소 패턴이 과도하다고 생각하기 때문에 대부분의 경우이를 고려해야합니다.