0

MVC3, EF 등을 처음 접했으므로 http://www.asp.net/mvc에서 MVC3 튜토리얼을 읽고 아직 응용 프로그램을 설정하지 않았습니다.정적? Repositories MVC3, EF4.2 (코드 우선)

여기에 지금까지 내 응용 프로그램의 "구조"의

  • GenericRepository
  • PropertyRepository는 회원으로 PropertyRepository있다 "재산권"엔티티
  • HomeController에 대한 GenericRepository을 상속합니다.

예 :

public class HomeController 
{ 
    private readonly PropertyRepository _propertyRepository 
      = new PropertyRepository(new ConfigurationDbContext()); 
} 
이제

의 다음 생각 해보자 : 나는 위해 하나의 트랜잭션에있을 필요가 6 개 쿼리를 호출, 꽤 많은 시간이 소요 내 GenericRepository의 방법이

을 정직성을 유지합니다. 내 Google 결과 yeldet SaveChanges() 하나의 트랜잭션으로 간주됩니다 - 그래서 내 컨텍스트를 여러 변경 한 다음 SaveChanges() 호출하면 이러한 변경 내용을 SQL Server에서 "원자"수 "확실한"수 있습니다. 권리? 잘못된?

또한 _propertyRepository.InvokeLongAndComplex() 메서드를 호출하는 동작 메서드가 있습니다. 방금 ​​알아 냈다 : MVC는 각 요청에 대해 새 컨트롤러를 만듭니다. 따라서 데이터베이스 무결성이 엉망인 다중 PropertyRepositories으로 끝납니다. (데이터베이스의 연결된 속성 목록을 유지 관리해야하며 사용자가 속성을 이동하면 그에 따라 목록을 변경하는 데 6 단계가 필요하지만 수천 개가있을 때 모든 항목을 반복하지 않도록 ...)

GenericRepository과 내 PropertyRepository을 정적으로 만들려고하므로 모든 HomeController은 동일한 리포지토리를 사용하고 InvokeLongAndComplex 메서드를 동기화하여 한 번에 하나의 스레드 만 DB에 변경되도록합니다.

나는이 아이디어가 좋은 해결책은 아니지만이 문제에 대한 적절한 해결책을 찾지 못한다는 의혹을 가지고 있습니다. 어떤 사람들은 정적 저장소를 가지고도 괜찮습니까라고 말합니다 (상황은 어떻게됩니까?). 어떤 다른 사람들은 IOC/DI (?)를 사용한다고 말합니다. 이것은 설정해야 할 많은 작업들처럼 들리지만 (내 문제를 해결할 지 확신 할 수는 없지만 ...), 항상 컨테이너에 "주입" "동일한 컨텍스트 개체, 동일한 리포지토리를 사용하면 여러 스레드가 무결성을 엉망으로 만들지 않도록 InvokeLongAndComplex() 메서드를 동기화하는 것으로 충분합니다.

Why aren't data repositories static? 대답 2 : 당신은 종종 1 개 저장소 인스턴스 당 요청 다른 사용자 엉망 일을하지 않습니다 쉽게 하나의 사용자로부터의 미트되지 않은 변경을 확인하기 위해 확인해야 할

2).

왜 요청마다 저장소 인스턴스가 링크 된 목록을 다시 엉망으로 만들지 않습니까?

누구든지 내가 따라야 할 조언이나 조언을 공유 할 수 있습니까?

답변

1

아니요!must have a new context for each request 그래서 저장소를 정적으로 만들더라도 리포지토리 내에서 단일 컨텍스트를 유지하는 대신 현재 컨텍스트 인스턴스를 각 메서드에 전달해야합니다.

무결성이란 무엇입니까? 트랜잭션, 동시성 문제 또는 참조 제약 사항을 다루고 있습니까? 이러한 모든 문제를 처리하는 것은 귀하의 책임입니다. EF는이를위한 몇 가지 기본 인프라를 제공 할 예정이지만 최종 솔루션은 구현에 달려 있습니다.

+0

HomeController 생성자에서 새 Context를 만듭니다. 그래서 나는 요청 당 새로운 것을 가질 것이다. 하지만 모든 저장소에 동일한 인스턴스를 사용해야합니까? 무결성이란 데이터베이스의 연결된 목록을 의미하므로 엔티티를 조작 (추가/제거/이동) 할 때 두 개의 스레드가 목록을 조작하지 않도록해야합니다. –

+0

내 단체/테이블은 다음 게시물에 있습니다. http://stackoverflow.com/questions/675117/fetching-linked-list-in-mysql-database. 이 질문에 내 문제를 설명하려고합니다 : 두 사용자가 ID 4 (User1 머리, User2 to tail) 노드를 변경하는 경우 내 List "엉망"은 동일한 ID를 가진 부모가 있기 때문에 노드를 검색 할 수 없음을 의미합니다. 모든 요청에 ​​대해 모든 저장소에 대해 동일한 컨텍스트를 사용하면 모든 것이 정상적이어야합니다. 내 문제는 이동 작업 중에 두 번째 요청을 생성 할 때 시퀀스에 요소가 없다는 오류가 발생한다는 것입니다. –

+0

한 가지 컨텍스트가 도움이되지 않습니다. 여러 스레드가 단일 엔티티를 변경하고 어떤 스레드가 SaveChagnes를 호출하면 불완전한 변경 사항을 다른 스레드에서도 저장하기 때문에 동일한 문제가 발생합니다. [동시 처리] (http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the-entity)를 찾고 있습니다. -framework.aspx). –

관련 문제