development

Entity Framework 및 호출 context.dispose ()

big-blog 2020. 12. 3. 08:05
반응형

Entity Framework 및 호출 context.dispose ()


언제 DbContext.dispose()엔티티 프레임 워크로 호출해야 합니까?

  1. 이 상상의 방법이 나쁜가요?

    public static string GetName(string userId)
    {
        var context = new DomainDbContext();
        var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        context.Dispose();
        return userName;
    }
    
  2. 이게 더 낫습니까?

    public static string GetName(string userId)
    {
        string userName;
        using(var context = new DomainDbContext()) {
            userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
            context.Dispose();
        }
        return userName;
    }
    
  3. 이것이 더 낫습니까, 즉 using ()을 사용할 때 context.Dispose ()를 호출하지 않아야합니까?

    public static string GetName(string userId)
    {
        string userName;
        using(var context = new DomainDbContext()) {
            userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        }
        return userName;
    }
    

사실 이것은 하나의 두 가지 질문입니다.

  1. 나는 언제 Dispose()컨텍스트를 해야 합니까?
  2. 내 컨텍스트의 수명은 어떻게 되나요?

대답:

  1. 절대 1 . 블록 에서 using암시 적 Dispose()입니다 try-finally. Dispose예외가 일찍 발생하면 별도의 문이 누락 될 수 있습니다. 또한 대부분의 경우 Dispose(암시 적 또는 명시 적으로) 전혀 호출 하지 않는 것은 해롭지 않습니다 .

  2. 예를 들어 Entity Framework 4-winform 응용 프로그램의 컨텍스트 수명 / 범위를 참조하십시오 . 요컨대 수명은 "짧아야"하고 정적 컨텍스트는 좋지 않습니다.


1 일부 사람들이 언급했듯이이 규칙의 예외는 컨텍스트가 IDisposable자신 을 구현 하고 수명주기를 공유 하는 구성 요소의 일부인 경우입니다 . 이 경우 구성 요소 context.Dispose()Dispose메서드를 호출 합니다.


EF를 사용하기 위해 몇 가지 좋은 자습서를 따랐지만 컨텍스트를 처리하지 않습니다.

나는 그것에 대해 조금 궁금했고 존경받는 Microsoft VIP조차도 컨텍스트를 처리하지 않는다는 것을 알았습니다. 나는 것을 발견 하면 dbContext을 처분하지 않아도 정상적인 상황에서.

더 많은 정보를 원하시면 그 이유를 요약 한이 블로그 게시물읽어보십시오 .


그래도 낫다:

public static string GetName(string userId)
{
    using (var context = new DomainDbContext()) {
        return context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
    }
}

using범위 밖에서 결과를 반환 할 필요가 없습니다 . 즉시 반환하면 원하는 폐기 동작을 얻을 수 있습니다.


데이터베이스 컨텍스트를 클래스 필드로 정의하고 IDisposable. 아래와 같은 것 :

public class MyCoolDBManager : IDisposable
{
    // Define the context here.
    private DomainDbContext _db;

    // Constructor.
    public MyCoolDBManager()
    {
        // Create a new instance of the context.
        _db = new DomainDbContext();
    }

    // Your method.
    public string GetName(string userId)
    {           
        string userName = _db.UserNameItems.FirstOrDefault(x => x.UserId == userId);

        return userName;
    } 

    // Implement dispose method.
    // NOTE: It is better to follow the Dispose pattern.
    public void Dispose()
    {
         _db.dispose();
         _db = null;
    }
}

참고 URL : https://stackoverflow.com/questions/15666824/entity-framework-and-calling-context-dispose

반응형