0

今日の午後、たくさんの記事を見てきましたが、私がやろうとしていることに対処するモデル内の複雑なオブジェクトを扱った完全な投稿を見つけることができないようです。

コードファーストアプローチを使用していますが、データベース構造を直接変更するモデルがありません。したがって、データベース構造に変更が生じた場合は、手動でモデルを変更しています。

そうは言っても、私は次の表を持っています:

Name
Address1
Address2
Address3
City
State
Zip
Latitude
Longitude

次のようなモデルを作成したいと思います。

public class Person
{
  public string Name { get; set; }
  public Address Address { get; set; }
  public Coordinates Coordinates { get; set; }
}
public class Address {
  public string Address1 { get; set; }
  public string Address2 { get; set; }
  public string Address3 { get; set; }
  public string City { get; set; }
  public string State { get; set; }
  public string Zip { get; set; }
}
public class Coordinates
{
  public float Latitude { get; set; }
  public float Longitude { get; set; }
}

私の頭の中では、これはデータベースから戻ってくる1対1のデータに対するきちんとしたオブジェクト指向のアプローチのように思えます。これらすべての個別の変数の代わりに、同様のデータがサブクラスにグループ化されます。

私の質問は、EFを使用してこの複雑なモデルをデータベースにバインドするにはどうすればよいですか?それが不可能な場合、この方法でデータを処理するカスタムバインダーを作成するにはどうすればよいですか。

それとも私はこれについて間違って考えていますか?これにアプローチする別の方法はありますか、それともデータを別の方法で構造化する必要がありますか?

編集

以下のJasonMeckleyの応答に基づいて、これは私がこのタスクを完了するために使用した最後のコードです。

namespace MyNamespace
{
  public partial class Person
  {
    public string Name { get; set; }
    public Address Address { get; set; }
    public Coordinates Coordinates { get; set; }
  }
  [ComplexType]
  public class Address
  {
    [Display(Name = "Address")]
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
  }
  [ComplexType]
  public class Coordinates
  {
    public float Latitude { get; set; }
    public float Longitude { get; set; }
  }

  public partial class DATABASE_CONNECTION_NAME : DbContext
  {
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Address1)
          .HasColumnName("Address1");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Address2)
          .HasColumnName("Address2");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Address3)
          .HasColumnName("Address3");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.City)
          .HasColumnName("City");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.State)
          .HasColumnName("State");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Zip)
          .HasColumnName("Zip");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Coordinates.Latitude)
          .HasColumnName("Latitude");
      modelBuilder
          .Entity<Person>()
          .Property(x => x.Coordinates.Longitude)
          .HasColumnName("Longitude");
    }
  }
}
4

1 に答える 1

1

属性で装飾Addressします。dbcontext サブクラスで、複雑なプロパティをオーバーライドし、適切な列にマップします。Coordinates[ComplexType]OnModelCreating

デフォルトでは、複雑なオブジェクトはこのようにマッピングされるAddress_AddressためCoordinates_Latitude、デフォルトのマッピングを次のようにオーバーライドする必要があります

modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Address1)
          .HasColumnName("Address1");
于 2012-12-04T21:27:07.217 に答える