1

残念ながら変更できない既存のデータベースを使用しており、関係の作成に問題があるようです。私はEFに比較的慣れていません。いくつかの検索の結果、ユーザーが同様のことを達成しようとしていることがわかりましたが、この状況では、与えられたアドバイスは機能しないようです。

私は次のクラスを持っています:

public partial class Order
{
    public int Id { get; set; }
    public int BillingAddressId { get; set; }
    public int ShippingAddressId { get; set; }
    //more values

    public virtual Address ShippingAddress { get; set; }
    public virtual Address BillingAddress { get; set; }
}

public partial class Address
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    //more values
}

注文内のナビゲーションプロパティを介して配送/請求先住所にアクセスできるようにしたいと思います。ShippingAddressId/BillingAddressIdフィールドは両方ともAddressクラスに関連していIdますが、残念ながらデータベースに外部キーとして設定されていません。

私が達成しようとしている関係は多対一だと思います。つまり、注文には1つの配送先住所(住所)がありますが、住所は多くの注文の配送先住所にすることができます。

私は次の複数のバリエーションを試しました:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Order>().HasOptional(o => o.ShippingAddress)
        .WithMany()
        .HasForeignKey(o => o.ShippingAddressId);

}

しかし、Order.ShippingAddress.FirstNameにアクセスしようとするたびに、null参照例外が発生します。

私が達成しようとしていることは可能ですか?

4

1 に答える 1

1

遅延読み込みを無効にしている場合は、クエリにナビゲーション プロパティを「含める」必要があります。

これは、次のいずれかで実行できます。

context.Orders.Include(o=>o.ShippingAddress).Where..... // make sure you are `using System.Data.Entity;`
context.Orders.Include("ShippingAddress").Where.....

さらに、関係がオプションの場合は、FK id を null 可能にする必要があります。

public int? BillingAddressId { get; set; }
public int? ShippingAddressId { get; set; }
于 2013-03-08T10:04:19.263 に答える