2009-05-11 7 views
0

EF生成クラスで部分クラスを使用する状況でカスタムプロパティを処理する方法を教えてください。カスタムプロパティを使用したEntity Frameworkの部分クラスの使用

ここでセットアップです:

タイムシート表 - これは従業員の時間
を保存する - TimeSheetID(オート、int型、PK)
- ENTRYDATE(日時)
- 時間(int型)
- 社員は( int)

EmployeeHourlyRateテーブル - 従業員の現在の時間単価を格納します。過去のレートもここに保存されます。
- RateID(int型、PK)
- EffectiveDate(int型、PK)
- レート(ダブル)

これはEmployeeHourlyRateへのタイムシートから多くの関係です。 Employee's rateを見つけるために、timeSheetのEntryDateよりも小さいmax effectiveDateを選択します。

私は物事を円滑にするために、TimeSheetという部分クラスを作成し、そのクラスに「レート」という新しいプロパティを追加しました。私がしたいのは、TimeSheetsのコレクションにデータを移入するのと同じクエリから自分自身を移入することです。私はこれを処理するための簡単でクリーンな方法がないことを知っています。 (

var list = from ts in Context.TimeSheets 
      .... 
      select new TimeSheet() { 
       TimeSheetID = ts.TimeSheetID, 
       EntryDate = ts.EntryDate, 
       Hours = ts.Hours, 
       EmployeeID = ts.EmployeeID, 
       Rate = SomeRate //real code has been omitted 
      }; 

理論的にはこれは動作するはずですが、何らかの理由でEFは、私は、エンティティ生成されたクラスを再使用しています実行時に文句を言う:

は例えば、私は、このようにそれを行うことができます私は自分のカスタムクラスを作成する場合、それは正常に動作します。しかし、たとえそれが機能したとしても、フィールドのリストを維持して、EFから単一のクラスへのマッピングを維持する必要があります。つまり、TimeSheetテーブルに新しいフィールドを追加するとメンテナンスが問題になります。また、すべての情報を再入力する必要はありません。

私の質問は、どのように人々は一般的にこのシナリオを処理するのですか?私のEntryDateに基づいて正しい有効日を選択することについて、実際に私の結合ルールを効果的に知ることができるデータモデルで何かを行う方法がありますか?

+0

あなたが提供したコードの小さなスニペットでは、少し難解です。多分あなたの部分クラスの残りの部分... –

答えて

2

私はあなたが達成しようとしている正確に何を見て、多分このような何かが、仕事ができる(「SomeRate」コードを含む)あなたの完全なLINQクエリを見てみたい:

WARNING:エアコードを。

public partial class TimeSheet 
{ 
    public double Rate 
    { 
     get //Calculate your rate here... e.g. 
     { 
      if ((this.Employee == null) || (this.Employee.EmployeeHourlyRates.Count == 0)) 
       //throw an exception 

      EmployeeHourlyRate maxRate; 
      foreach (EmployeeHourlyRate rate in this.Employee.EmployeeHourlyRates) 
      { 
       if ((rate.EffectiveDate <= this.EntryDate) 
        && ((maxRate == null) || (maxRate.EffectiveDate < rate.EffectiveDate))) 
       { 
        maxRate = rate; 
       } 
      } 

      if (maxRate == null) 
       //throw exception 
      else 
       return maxRate.Rate; 
     } 
    } 
} 

EDIT:データベースの往復を避けるために熱心な負荷の例を追加します。

var list = from ts in Context.TimeSheets.Include("Employee.EmployeeHourlyRate") 
      where blah blah 
      select ts; 
+0

これは、それが追加のデータベースヒットを引き起こしたという事実でなければ、うまくいくかもしれません。グリッドビューのシナリオでオブジェクトが使用されます...グリッドに50レコードがある場合、それらのレコードのそれぞれがデータベースにクエリを行い、大きな遅延が発生します。 – bugfixr

+0

どのようにデータベースを実行するかに応じて、関係するエンティティ(例えば私の編集された回答を参照)を "熱心に読み込む"か、.Load()と.IsLoaded()を組み合わせてエンティティを「怠惰に読み込む」ことができます。 ...最高の方法がどれだけあるかあなただけが知っている。 – Charlino

関連する問題