1

EF4 CTP5 を使用しています。ここに私のPOCOがあります:

public class Address
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
}

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Address> Addresses { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public decimal Total { get; set; }
    public Address ShippingAddress { get; set; }
    public Address BillingAddress { get; set; }
}

Address を Order クラスの ComplexType にする方法はありますか? これで遊んだ後、そうではないと思いますが、私が見たことのない方法があるかもしれません.

編集:以下のショーンに応えて、私はそれに最善を尽くしました:

//modelBuilder.Entity<Order>().Ignore(o => o.BillingAddress);
//modelBuilder.Entity<Order>().Ignore(o => o.ShippingAddress);
modelBuilder.Entity<Order>()
    .Property(o => o.BillingAddress.City).HasColumnName("BillingCity");

実行時に「構成されたプロパティ 'BillingAddress' は、エンティティ 'Order' で宣言されたプロパティではありません」というエラーで失敗します。 使おうとしてもうまくいきIgnore()ません。次に、Hanselman の記事は CTP4 ですが、CTP5 に相当するものは次のとおりです。

modelBuilder.Entity<Order>().Map(mapconfig =>
{
    mapconfig.Properties(o => new {
        o.Id
        , o.Total
        , o.BillingAddress.City
    });
    mapconfig.ToTable("Orders");
});

「タイプ 'Order' のプロパティ 'BillingAddress.City' をそのマッピングに含めることはできません」というエラーで失敗します。

あきらめる。たぶん、最終リリースはこのようなものになるでしょう。または、NHibernate に切り替える必要があるかもしれません =)

4

2 に答える 2

1

あなたがする必要があるのはComplexTypeAttribute、 Address クラスに配置することだけです:

[ComplexType]
public class Address
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PostalCode { get; set; }
}

または、流れるような API でこれを実現できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ComplexType<Address>();
}

ただし、アドレス型をエンティティと複合型の両方にすることはできません。それは何らかの方法です。

これについて詳しく説明している次のブログ投稿を ご覧ください:
Associations in EF Code First CTP5: Part 1 – Complex Types

于 2011-01-30T21:28:37.937 に答える
0

Order と同じテーブルに入れたい場合Addressは、DbContext OnModelCreating オーバーライドでそれを EF に伝える必要があります。

ここを見てください: http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx

于 2011-01-30T21:11:15.950 に答える