지원 필드

백업 필드를 사용하면 EF가 속성이 아닌 필드를 읽고/또는 쓸 수 있습니다. 이 기능은 클래스의 캡슐화를 사용하여 애플리케이션 코드로 데이터에 대한 액세스와 관련된 의미 체계를 제한 및/또는 향상하는 데 사용할 때 유용할 수 있지만 이러한 제한 사항/향상된 기능을 사용하지 않고 데이터베이스에서 값을 읽고/또는 데이터베이스에 기록해야 합니다.

기본 구성

규칙에 따라 다음 필드는 지정된 속성에 대한 지원 필드로 검색됩니다(우선 순위로 나열됨).

  • <camel-cased property name>
  • _<camel-cased property name>
  • _<property name>
  • m_<camel-cased property name>
  • m_<property name>

다음 샘플에서 Url 속성은 _url을 지원 필드로 사용하도록 구성됩니다.

public class Blog
{
    private string _url;

    public int BlogId { get; set; }

    public string Url
    {
        get { return _url; }
        set { _url = value; }
    }
}

백업 필드는 모델에 포함된 속성에 대해서만 검색됩니다. 모델에 포함되는 속성에 대한 자세한 내용은 속성 포함 및 제외를 참조하세요.

데이터 주석 또는 Fluent API를 사용하여 지원 필드를 구성할 수도 있습니다( 예: 필드 이름이 위의 규칙에 해당하지 않는 경우).

public class Blog
{
    private string _validatedUrl;

    public int BlogId { get; set; }

    [BackingField(nameof(_validatedUrl))]
    public string Url
    {
        get { return _validatedUrl; }
    }

    public void SetUrl(string url)
    {
        // put your validation code here

        _validatedUrl = url;
    }
}

필드 및 속성 액세스

기본적으로 EF는 백업 필드가 제대로 구성되었다고 가정하고 항상 백업 필드를 읽고 쓰며 속성을 사용하지 않습니다. 그러나 EF는 다른 액세스 패턴도 지원합니다. 예를 들어 다음 샘플에서는 구체화하는 동안에만 지원 필드에 쓰고 다른 모든 경우에서 속성을 사용하도록 EF에 지시합니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Url)
        .HasField("_validatedUrl")
        .UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction);
}

지원되는 옵션의 전체 집합은 PropertyAccessMode 열거형을 참조하세요.

필드 전용 속성

엔터티 클래스에 해당 CLR 속성이 없지만 대신 필드를 사용하여 엔터티에 데이터를 저장하는 개념적 속성을 모델에 만들 수도 있습니다. 이는 데이터가 엔터티의 CLR 형식이 아닌 변경 추적기에서 저장되는 섀도 속성과 다릅니다. 필드 전용 속성은 일반적으로 엔터티 클래스가 값을 가져오기/설정하는 속성 대신 메서드를 사용하거나 도메인 모델(예: 기본 키)에서 필드가 전혀 노출되어서는 안 되는 경우에 사용됩니다.

Property(...) API에서 이름을 제공하여 필드 전용 속성을 구성할 수 있습니다.

internal class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property("_validatedUrl");
    }
}

public class Blog
{
    private string _validatedUrl;

    public int BlogId { get; set; }

    public string GetUrl()
    {
        return _validatedUrl;
    }

    public void SetUrl(string url)
    {
        using (var client = new HttpClient())
        {
            var response = client.GetAsync(url).Result;
            response.EnsureSuccessStatusCode();
        }

        _validatedUrl = url;
    }
}

EF는 지정된 이름의 CLR 속성 또는 속성을 찾을 수 없는 경우 필드를 찾으려고 시도합니다. 속성과 필드를 모두 찾을 수 없는 경우 섀도 속성이 대신 설정됩니다.

LINQ 쿼리에서 필드 전용 속성을 참조해야 할 수도 있지만 이러한 필드는 일반적으로 비공개입니다. LINQ 쿼리에서 EF.Property(...) 메서드를 사용하여 필드를 참조할 수 있습니다.

var blogs = db.blogs.OrderBy(b => EF.Property<string>(b, "_validatedUrl"));