サーチ…


前書き

エンティティ分割またはテーブル分割をサポートするように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を持つテーブルとアドレスの詳細を持つテーブルの2つのテーブルにマップしたいとします。もちろん、アドレスが所属する人物を特定するには、ここにPersonIdが必要です。ですから、基本的にはエンティティを2つ(またはそれ以上)の部分に分割することです。したがって、名前、エンティティ分割。これを行うには、各プロパティを別のテーブルにマッピングします。

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という2つのテーブルが作成されます。 personにはPersonIdとNameの2つのフィールドがあり、PersonDetailsにはPersonId、AddressLine、CityとZipCodeの4つの列があります。 Peopleでは、PersonIdが主キーです。 PersonDetailsでは、プライマリ・キーもPersonIdですが、Person表のPersonIdを参照する外部キーです。

People DbSetを照会すると、EFはPersonIdsの結合を実行して、両方の表からデータを取得してエンティティーを取り込みます。

また、列の名前を変更することもできます。

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");
  });
}

これにより同じテーブル構造が作成されますが、PeopleテーブルにはNameカラムの代わりにPersonNameカラムがあり、PersonDetailsテーブルにはPersonIdカラムの代わりにProprietorIdがあります。

テーブル分割

そして、エンティティ分割の反対をしたいとしましょう:1つのエンティティを2つのテーブルにマッピングするのではなく、1つのテーブルを2つのエンティティにマッピングしたいとします。これはテーブル分割と呼ばれます。 PersonId、Name、AddressLine、City、ZipCodeの5つの列を持つテーブルが1つあり、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; }
}

1つのことはすぐに飛び出します.AddressにAddressIdはありません。これは、2つのエンティティが同じテーブルにマップされているため、同じ主キーも持つ必要があるためです。あなたがテーブル分割を行う場合、これはあなたが対処しなければならないものです。したがって、テーブル分割の他に、アドレスエンティティを設定してプライマリキーを指定する必要もあります。そして、ここに方法があります:

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