Share via


프록시 작업

POCO 엔터티 형식의 인스턴스를 만들 때 Entity Framework는 엔터티의 프록시 역할을 하는 동적으로 생성된 파생 형식의 인스턴스를 만드는 경우가 많습니다. 이 프록시는 속성에 액세스할 때 자동으로 작업을 수행하기 위한 후크를 삽입하도록 엔터티의 일부 가상 속성을 재정의합니다. 예를 들어 이 메커니즘은 관계의 지연 로드를 지원하는 데 사용됩니다. 이 토픽에서 설명하는 방법은 Code First 및 EF 디자이너를 사용하여 만든 모델에 동일하게 적용됩니다.

프록시 만들기 사용 안 함

경우에 따라 Entity Framework에서 프록시 인스턴스를 만들지 못하게 하는 것이 유용합니다. 예를 들어 프록시가 아닌 인스턴스를 직렬화하는 것은 프록시 인스턴스를 직렬화하는 것보다 훨씬 쉽습니다. ProxyCreationEnabled 플래그를 지우면 프록시 만들기를 해제할 수 있습니다. 이 작업을 수행할 수 있는 한 위치는 컨텍스트의 생성자에 있습니다. 예시:

public class BloggingContext : DbContext
{
    public BloggingContext()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }  

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

EF는 프록시가 수행할 작업이 없는 형식에 대한 프록시를 만들지 않습니다. 즉, 봉인되거나 가상 속성이 없는 형식을 사용하여 프록시를 방지할 수도 있습니다.

프록시 인스턴스를 명시적으로 만들기

새 연산자를 사용하여 엔터티의 인스턴스를 만드는 경우 프록시 인스턴스가 만들어지지 않습니다. 이는 문제가 되지 않을 수 있지만 프록시 인스턴스를 만들어야 하는 경우(예: 지연 로드 또는 프록시 변경 내용 추적이 작동하도록) DbSetCreate 메서드를 사용하여 수행할 수 있습니다. 예시:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Create();
}

파생 엔터티 형식의 인스턴스를 만들려는 경우 Create의 제네릭 버전을 사용할 수 있습니다. 예시:

using (var context = new BloggingContext())
{
    var admin = context.Users.Create<Administrator>();
}

Create 메서드는 만든 엔터티를 컨텍스트에 추가하거나 연결하지 않습니다.

Create 메서드는 엔터티에 대한 프록시 형식을 만드는 경우 아무 작업도 수행하지 않으므로 값이 없는 경우 엔터티 형식 자체의 인스턴스를 만듭니다. 예를 들어 엔터티 형식이 봉인되어 있거나 가상 속성이 없는 경우 Create는 엔터티 형식의 인스턴스만 만듭니다.

프록시 형식에서 실제 엔터티 형식 가져오기

프록시 형식에는 다음과 같은 이름이 있습니다.

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

ObjectContextGetObjectType 메서드를 사용하여 이 프록시 형식의 엔터티 형식을 찾을 수 있습니다. 예시:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    var entityType = ObjectContext.GetObjectType(blog.GetType());
}

GetObjectType에 전달된 형식이 프록시 형식이 아닌 엔터티 형식의 인스턴스인 경우 엔터티 형식은 여전히 반환됩니다. 즉, 형식이 프록시 형식인지 여부를 확인하기 위해 다른 검사 없이 이 메서드를 사용하여 실제 엔터티 형식을 가져올 수 있습니다.