1

コードファーストのアプローチで作成された EntityFramework ベースのデータベースをここに持っています。データベースには、親子関係を持つ 2 つのテーブルが含まれています。

  1. Orderlists(モデル"Orderlist"に基づく)
  2. Orders(モデル「注文」に基づく)

ここで Orderlists には、ICollection<Order> Orders関連するすべての注文をリストする (!) 必要がある が含まれています。どういうわけかそうではありません。

コントローラーの DbContext には、次の 2 つの DbSet が含まれています。

  1. DbSet<Orderlist>
  2. DbSet<Order>

一方、モデルOrderには 2 つのプロパティがあります (括弧内に型を示します)。

  1. int OrderlistId
  2. Orderlist OrderList

新しいOrderオブジェクトの [HttpPost] Createメソッドのコントローラーで、DbContextから適切なOrderlistオブジェクト (正しく提供/選択された ID を持つ) を選択し、新しく作成されたOrderのOrderlistIdOrderlistを設定して、この関係を結び付けています。オブジェクトを適切に選択し、選択したOrderlistのOrdersコレクションにOrderを追加します (null の場合はコレクションを作成します)。

それから私はdb.SaveChages();それがすべきことをする a をします。

モデルのコードから最初にデータベースを生成すると、関係に関してはOrderlistIdプロパティのみがデータテーブルにフィールドを生成します。OrderlistOrdersコレクションもOrderOrderlistプロパティもテーブルにフィールドを生成しません。これはまだ有効なリレーションであるため問題ありません。Orderlist の ID はPKであり、OrderlistIdの値は正しく設定されています。データテーブルのスキームは、外部キーによる関係も反映しています。

ここでの問題は、アプリケーションの別の時点でデータを処理するときに関係が復元されないことです。Orders ICollectionは、DbContext から選択すると常に nullになります。

私の質問は次のとおりです。オブジェクトを作成するときに注文 ICollectionを自動的に入力する必要がありますか? または、の注文をDbContext反復処理して手動で入力し、適切なすべての注文を関連する注文リストに手動で追加する必要がありますか? また、そうしなければならない場合、どこで、どのようにすればよいのでしょうか?DbSetDbContext

4

1 に答える 1

1

Entity Framework Code First モデルのすべての関連付けプロパティは、関連付けられたエンティティをオンデマンド (遅延読み込み) で自動的に読み込むようにする場合、 virtualキーワードでマークする必要があります。

次の (基本的な) モデル定義が機能するはずです。

public class OrderList
{
    public int OrderListId { get; set; }

    public virtual ICollection<Order> Orders { get; set; } // note the use of virtual
}

public class Order
{
    public int OrderId { get; set; }

    public int OrderListId { get; set; }
    public virtual OrderList OrderList { get; set; } // note the use of virtual
}

また、Order を OrderList に追加する場合、Order エンティティに関連付けプロパティを設定する必要がないことに注意してください。次のように、新しい Order を OrderList エンティティの Orders コレクションに追加するだけです。

int orderListId = 1;
OrderList orderList = context.OrderLists.Find(orderListId);

Order newOrder = new Order();
orderList.Orders.Add(newOrder);
context.SaveChanges();

または、新しい Order に OrderListId プロパティを設定し、それを DbContext Orders コレクションに追加することもできます。

Order order = new Order();
order.OrderListId = 1;
context.Orders.Add(order);
context.SaveChanges();
于 2012-09-23T15:20:21.133 に答える