Entity Framework
고급 매핑 시나리오 : 엔티티 분할, 테이블 분할
수색…
소개
엔터티 분할 또는 테이블 분할을 지원하도록 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"));
}
}