문제

나는 코드에서 엔티티 컨텍스트를 만들 때 프로그래머가 접근하는 두 가지 다른 방식을 보았습니다.

첫 번째는 그런 것과 같으며 MSDN 코드 예제에서 찾을 수 있습니다.

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

두 번째는 일부 클래스에서 비즈니스 논리를 캡슐화하는 개인 속성으로 컨텍스트를 작성하는 것입니다. 그래서 당신은 다음과 같은 것을 가질 것입니다.

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

어떤 방식으로 더 효율적입니까?

두 가지 방법이 있다고 가정하고 하나는 dosomething1 ()과 다른 하나라고 불리는 dosomething2 ()라고 가정하고 두 가지 방법 모두 사용 설명서를 통합하여 컨텍스트를 열고 그와 무엇이든 수행합니다. 한 방법을 다른 방법으로 호출해야했는데, 본질적으로 두 방법 모두 컨텍스트를 생성 한 다음 완료되면 정리하기 때문에 불필요한 오버 헤드가 발생합니까? 클래스 객체가 인스턴스화 될 때 생성 된 하나의 개인 속성을 갖는 것과는 달리, 객체가 범위를 벗어나면 차례로 정리합니까?

도움이 되었습니까?

해결책

매번 새 ObjectContext를 작성하려면 '일부'오버 헤드가 포함됩니다. 기본적으로 관련된 오버 헤드는 전역 캐시에서 특정 ObjectContext와 관련된 메타 데이터로 메타 데이터를 복사하는 것입니다.

이 오버 헤드는 비교적 사소하기 때문에 종종 사용 패턴에 내재 된 추가 안전을 고려할 때 걱정할 가치가 없습니다.

당신이 선택한 옵션은 나에게 다음과 같은 것들에 따라 다릅니다.

  1. 랩핑 클래스가 얼마나 오래 살았습니까? 오랫동안 살아남는 경우 ObjectContext는 시간이 지남에 따라 많은 엔티티가 속도가 느려질 수 있습니다. 따라서 매번 새로운 ObjectContext가 좋은 생각 일 수 있습니다.
  2. 랩핑 클래스의 메소드에 대한 호출이 동기화됩니까? ObjectContext 클래스 자체는 ThreadSafe가 아니므로 두 번째 패턴을 사용하는 경우 여러 스레드가 호출 할 것으로 예상되는 경우 랩핑 클래스 / 저장소가 스레드 안전한지 확인해야합니다.
  3. 방법이 본질적으로 관련이 없습니까? 그렇다면 메소드간에 하나의 컨텍스트를 공유하면 예상치 못한 부작용을 얻을 수 있습니다.

일반적으로 내 권장 사항은 방법이 무국적자 인 경우 각 방법에 대한 새로운 컨텍스트를 잊어 버리는 것이 좋은 생각 일 것입니다.

그러나 당신이 비교적 짧은 상태의 상태가있는 형태 나 무언가를 가지고 있다면 아마도 공유 된 맥락이 더 나은 아이디어 일 것입니다.

업데이트 : 나는 시간을 모은 시간을 모았습니다 더 완전한 대답

다른 팁

두 번째 옵션은 실제로 당신이 의미하는 경우 그 자체로 정리되지 않습니다. 난 후에 처리 할 필요가 없기 때문에 ObjectContext 버전 사용을 선호합니다. 그래도 질문을 제대로 얻었는지 확실하지 않습니다 ... 오늘 너무 많은 시간 프로그래밍.

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

그런 다음이 저장소를 사용하려면 다음과 같은 작업을 수행합니다.

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top