0

エンティティモデルにマスター詳細関係があります(従来のNorthwind Orders-OrderDetailsを簡単に考えられるようにするため)エンドユーザーは、マスターパーツの詳細をグリッドに入力してから、下のグリッドに移動して'を入力します。関連する詳細。

エンティティモデル自体の中から、その注文に関連する新しいOrderDetailレコードを作成するたびに、注文テーブルから「CustomerId」値に相当するものを取得し、それを使用して必要な特定の情報を取得できるようにしたいと思います。各詳細レコードにあります。

エンティティモデル自体でこれを行う簡単な方法はありますか?これはvbで行いますが、C#を読むことができます。

明確化のための追加情報:

ジェリックは彼の答えの中で興味深い点を指摘しました。これは、テーブルが適切に正規化されていない可能性があることを示唆していることを私は彼に感謝します。通常の状況では同意しますが、ここでは自分の制御できない制約によって強制されます。Tisは、商業漁業者による魚の水揚げを記録するアプリケーション用です。各水揚げはいくつかの異なる種類の魚で構成されている可能性があり、すべての水揚げの詳細は法律により政府機関に報告する必要があります。

この目的のために、魚が捕らえられた正確な場所が重要であるため、各ラインの詳細(着陸の詳細ライン)は、アイテムが捕らえられたエリアとゾーンを記録する必要があります。ほとんどの小型ボートの場合、この情報はほとんど常に同じです(ただし、数か月間海に出る大型ボートは、いくつかのエリアやゾーンで魚を捕まえることができます(したがって要件))。

アプリケーションのエンドユーザーがこれを簡単に行えるようにするために、デフォルトのエリアとゾーンの詳細を船舶の記録(Northwindの顧客に相当)に記録するのが理にかなっていると感じました。ランディングヘッダーテーブル(Northwind Order)内に、vesselIdへの参照があります。着陸詳細線が入力されたら、着陸ヘッダーを参照して船舶IDを取得し、それを関数のパラメーターとして使用して、その船舶に関連付けられているデフォルトのエリアとゾーンを取得します。

これを行うためにエンティティフレームワークを使用しているので、ランディングの最終IDが何になるかはまだわかりません(まだコミットされていません。エンティティフレームワークの利点は、この種のデータ入力が簡単になることです。 )そのため、「公式」IDがまだ作成されていないランディングヘッダーから船舶IDを取得しようとしています。

ほとんどの場合(私自身も含む)、これがデータベースの正規化の問題であると考えるように促す質問の方が理にかなっていると思います。

私がやろうとしているのは、着陸詳細エンティティのOn PropertyChangingイベントの1つで、まだデータベースにコミットされていない、関連付けられた着陸ヘッダーエンティティのvesselIdを取得する方法を見つけることです。これはclientcacheにありますが、まだデータベースにはありません。

どうもありがとう

4

1 に答える 1

0

質問が正しければ、Customer エンティティに基づいて設定された OrderDetail エンティティにいくつかのプロパティがあると言っています。OrderDetail から Order to Customer へのリンクをトラバースすることで、OrderDetail エンティティから顧客の詳細を照会できるはずなので、これは奇妙だと思います。OrderDetail テーブルの下に Customer プロパティ (Gender など) を永続化する必要はありません。スキーマをより適切に正規化することを検討することをお勧めします。

いずれにせよ、次のエンティティがあるとします。

public class Customer {
    [Key]
    public int Id {get; set;}
    public string Name {get; set;}
    public string Gender {get; set;}
    public virtual ICollection<Order> Orders {get; set;} //<-- I'm also assuming you have a 1 Customer to Many Order relationship
}


public class Order {
    [Key]
    public int Id {get; set;}
    [Required]
    public int CustomerId {get; set;}
    public virtual Customer Customer {get; set;} //<-- assumes a Customer Entity also exists
    public virtual ICollection<OrderDetail> OrderDetails {get; set;} //<-- I'm also assuming you have a 1 Order to Many Order Detail relationship
}

public class OrderDetail {
     [Key]
     public int Id {get;set;}
     [Required]
     public int OrderId {get; set;} //<-- each Order Detail *must* be linked to an order
     public virtual Order Order {get; set;}
     public string CustomerGender {get; set;} //<-- property that gets populated based on the customer that is related to the parent Order of this detail
     //other properties
 }

OrderDetail インスタンスを構築するときは、それがどの注文にリンクされているかを知っている必要がありますが、この場合に見られるように、必ずしも顧客である必要はありません。

var orderDetail = new OrderDetail {OrderId = 1};

挿入メソッドでは、挿入する前に、Customer の詳細を取得し、orderDetail の関連フィールドにデータを入力する必要があります。OrderId がわかっているので、LINQ を使用して、関連する顧客の詳細を照会できます。この例では、Customer.Gender を取得し、それを OrderDetail.CustomerGender に割り当てます。おそらくこれを 1 つのステートメントに書き出すことができますが、読みやすくするために分割します。

//step 1, get the Customer object based on the OrderId
var cust = context.Set<Order>().Include(o => o.Customer)
                  .Where(o => o.Id == orderDetail.OrderId)
                  .Select(o => o.Customer).SingleOrDefault();

//step 2, assign the Customer object property to the OrderDetail instance
orderDetail.CustomerGender = customer.Gender;

//step 3, persist the orderDetail entity
context.Set<OrderDetail>().Add(orderDetail);
context.SaveChanges();
于 2013-01-10T06:23:22.120 に答える