2009-08-26 10 views
0

私はテーブルのカップルを持っていると仮定します。MSエンティティフレームワークのサーバー側で関連エンティティをロードする方法は?

person(personid, name, email) 
employee(personid,cardno, departmentID) //personid,departmentID is foreign key 
department(departmentID, departmentName) 
employeePhone(personID, phoneID) //this is relationship table 
phone(phoneID, phonenumer) 

EntityFrameworkが従業員のためのエンティティクラスを生成する場合、このクラスは次のようにメンバーを持っています。このクラスがロードされると、デフォルトで

public partial class employee{ 
    int _personid; 
    string _cardno; 
    string _departmentName; 
    person _person; 
    department _department; 
    //...... 
} 

可能なデータのみを従業員表の列の場合、関連エンティティのデータはロードされません。 Linqを使用してクライアント側でデータを取得する場合は、linqクエリにIncludeを使用する必要があります。

私の質問は:従業員がサーバー側でインスタンス化されるときに、サーバー側で読み込まれる関連エンティティデータにしたいです。ですから、クライアント側でエンティティを取得すると、すべてのデータがすでに利用できるようになり、UIに簡単にバインドできます。

このリクエストを実装する方法は?

答えて

0

あなたが望むのは、依存エンティティの遅延読み込みです。下のリンクに記事があります。記事の一番下には、あなたがまだ必要性を感じている場合に、遅延ロードを実行する方法についての説明があります。

参照してください。この記事では、 "Entity Frameworkの中で遅延ロードの構成": Entity Framework and Lazy Loading

1

あなたのUIにエンティティタイプをバインドしないでください。これにより、UIがエンティティレイヤーに結合されます。ローディングはあなたの問題の中で最も少なくなります。結合されたUIを使用すると、単一責任の原則に違反し、ブラックリスト/ホワイトリストのセキュリティを維持する必要があり、循環参照を処理できないブレークタイプが必要です。関連するすべてのタイプのすべてのフィールドをロードするため、など、など、など

代わりに、その上に専用のビューモデルとプロジェクトを作成します。

var pm = (from e in Context.Employees 
      where e.Id == id 
      select new EmployeePresentation 
      { 
       EmployeeNumber = e.Number, 
       Name = e.Person.Name, 
       // etc. 
      }.First(); 

を、これはLINQはエンティティにあるので、などあなたが個人的に参照するフィールドは、あります遅延ロード、遅延ロード、または明示的なLoad()を必要とせずに自動的にロードされます。 しかしこれらのフィールドは、他のすべてのメソッドと同様に、Personの全体ではありません。

更新時、コメントごと プレゼンテーションモデルの使用も更新にとって重要です。ユーザーが見ることができるすべてのフィールドを更新できるようにする場合はありません。同じエンティティの異なるプレゼンテーションモデルは、アプリ内のデータフローの異なるポイントで使用されるため、異なる検証/スキャフォールディングルールを持つことがあります。また、ユーザは、見えないフィールド(例えば、タイムスタンプ)を暗黙的に更新すべきである。

総称的には、私のアップデートは、この(ASP.MVCのWebアプリ)のようになります。ユーザーはこれまでに型検査、型では、それらが許可されていない何かを更新する可能性がないと

public ActionResult Update(EmployeePresentation model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // User violated validation rule on presentation model. 
     return View(model); 
    } 
    Repository.Update(model.Id, delegate(Employee employee) 
    { 
     model.UpdateEmployee(employee); 
    }); 
    return RedirectToAction("Index"); 
} 

注意をモデルのバインディング、プレゼンテーションモデル、およびリポジトリをすべてカスタム動作のために拡張することができます。

+0

非常に良好です。しかし、質問です。エンティティにバインドしないと、データCUIDはどうですか? CUID用のコードをすべて自分で作成する必要があります。エンティティにUIをバインドすると、riaサービスのようないくつかのコード生成エンジンを再利用できます。あなたのソリューションは、読み取り専用のデータ用です。 – KentZhou

+0

いいえ、読み取り専用データではありません。それは*書くために*二重*重要です。私が言ったように、ビューモデルなしでは、ユーザー更新をホワイトリスト/ブラックリストに登録し、ユーザーデータをエンティティタイプに変換するか、最悪の場合、UIとバックエンド間の最も深いカップリングであるEF対応UIを作成する必要があります。答えを明確にして更新します。 –

+0

クレイグ、私もKentZhouのコメントに対するあなたの反応に興味があります。たとえば、EmployeePresentationオブジェクト(従業員番号と従業員名)の両方の値を更新するUI画面があるとします。プレゼンテーションをサービスまたはBLLレイヤーに戻すときは、常にEmployeesテーブルとPersonテーブルの両方を更新するだけですか? 従業員の更新と個人レコードの更新(データのさまざまなビュー)を更新するだけの場合に、さまざまなサービスを記述していますか? – Jay

関連する問題