수색…


소개

엔터티 분할 또는 테이블 분할을 지원하도록 EF 모델을 구성하는 방법

엔티티 분할

이처럼 엔티티 클래스가 있다고 가정 해 봅시다.

public class Person  
{
   public int PersonId { get; set; }
   public string Name { get; set; }
   public string ZipCode { get; set; }
   public string City { get; set; }
   public string AddressLine { get; set; }
}

그런 다음이 Person 엔티티를 PersonId와 Name이있는 테이블과 주소 세부 정보가있는 두 테이블로 매핑하려고한다고 가정 해 봅시다. 물론 주소가 속한 사람을 식별하려면 여기 PersonId가 필요합니다. 따라서 기본적으로 엔티티를 두 개 (또는 그 이상의) 파트로 분할하는 것이 좋습니다. 따라서 이름, 엔티티 분할. 각 속성을 다른 테이블에 매핑하여이 작업을 수행 할 수 있습니다.

public class MyDemoContext : DbContext  
{       
  public DbSet<Person> Products { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
      modelBuilder.Entity<Person>().Map(m =>
      {
         m.Properties(t => new { t.PersonId, t.Name });
         m.ToTable("People");
      }).Map(m => 
      {   
        m.Properties(t => new { t.PersonId, t.AddressLine, t.City, t.ZipCode });
        m.ToTable("PersonDetails");
      });
  }
}

People과 PersonDetails라는 두 개의 테이블이 생성됩니다. Person은 PersonId와 Name이라는 두 개의 필드를 가지며, PersonDetails는 PersonId, AddressLine, City 및 ZipCode라는 4 개의 열을 가지고 있습니다. People에서는 PersonId가 기본 키입니다. PersonDetails에서 기본 키는 PersonId이지만 Person 테이블의 PersonId를 참조하는 외부 키이기도합니다.

People DbSet을 쿼리하면 EF는 PersonID에 대한 조인을 수행하여 두 테이블에서 데이터를 가져 와서 엔터티를 채 웁니다.

열 이름을 변경할 수도 있습니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder)  
{
  modelBuilder.Entity<Person>().Map(m =>
  {
    m.Properties(t => new { t.PersonId });
    m.Property(t => t.Name).HasColumnName("PersonName");
    m.ToTable("People");
  }).Map(m =>
  {
    m.Property(t => t.PersonId).HasColumnName("ProprietorId");
    m.Properties(t => new { t.AddressLine, t.City, t.ZipCode });
    m.ToTable("PersonDetails");
  });
}

이렇게하면 같은 테이블 구조가 생성되지만 사람 테이블에는 이름 열 대신 PersonName 열이 있고 PersonDetails 테이블에는 PersonId 열 대신 ProprietorId가 있습니다.

테이블 분할

엔티티 분할의 반대를 원한다고 가정 해보자. 하나의 엔티티를 두 개의 테이블로 매핑하는 대신 하나의 테이블을 두 개의 엔티티로 매핑하고자한다. 이를 테이블 분할이라고합니다. PersonId, Name, AddressLine, City, ZipCode 등 5 개의 열이있는 테이블이 하나 있다고 가정 해 봅시다. 여기서 PersonId는 기본 키입니다. 그리고 여러분은 다음과 같은 EF 모델을 만들고 싶습니다 :

public class Person  
{
  public int PersonId { get; set; }
  public string Name { get; set; }
  public Address Address { get; set; }
}

public class Address  
{        
  public string ZipCode { get; set; }
  public string City { get; set; }
  public string AddressLine { get; set; }
  public int PersonId { get; set; }
  public Person Person { get; set; }
}

한 가지는 바로 뛰어납니다. 주소에 AddressId가 없습니다. 이는 두 엔티티가 동일한 테이블에 매핑되므로 동일한 기본 키를 가져야하기 때문입니다. 당신이 테이블 분할을한다면, 이것은 당신이 다루어야 할 것입니다. 따라서 테이블 분할 외에 주소 엔터티를 구성하고 기본 키를 지정해야합니다. 그리고 방법은 다음과 같습니다.

public class MyDemoContext : DbContext  
{
  public DbSet<Person> Products { get; set; }
  public DbSet<Address> Addresses { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
     modelBuilder.Entity<Address>().HasKey(t => t.PersonId);
     modelBuilder.Entity<Person>().HasRequired(t => t.Address)
                                  .WithRequiredPrincipal(t => t.Person);

     modelBuilder.Entity<Person>().Map(m => m.ToTable("People"));
     modelBuilder.Entity<Address>().Map(m => m.ToTable("People"));
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow