Entity Frameworkでカスタムプロパティを使用して部分クラスを使用する

asp.net c# entity-framework

質問

EF生成クラスで部分クラスを使用する状況でカスタムプロパティを処理する方法

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

タイムシートテーブル - これは従業員の時間を格納します
- TimeSheetID(自動、整数、PK)
- EntryDate(日時)
- 時間(int)
- 従業員ID(int)

EmployeeHourlyRateテーブル - これは従業員の現在の1時間あたりの料金を格納します。履歴レートもここに格納されています。
- RateID(整数、PK)
- EffectiveDate(int、PK)
- 料金(ダブル)

これは、タイムシートからEmployeeHourlyRateまでの1対多の関係です。従業員の率を見つけるために、timeSheetのEntryDateよりも小さいmaximum effectiveDateを選択します。

作業を容易にするために、TimeSheetという部分クラスを作成し、そのクラスに "Rate"という新しいプロパティを追加しました。私がやりたいことは、自分自身の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から単一クラスへのマッピングを続けなければなりません。つまり、TimeSheetテーブルに新しいフィールドを追加すると、メンテナンスが問題になります。その情報をすべて再入力しなければならないのもばかげています。

それで私の質問は、一般的にこのシナリオを人々がどのように処理するのでしょうか。データモデル内で、自分の参加ルールを効率的に認識し(EntryDateに基づいて正しい有効日を選択することについて)、これを処理できる方法がありますか。

受け入れられた回答

私があなたが達成しようとしていることを正確に見るためにあなたの完全なLINQクエリ( 'SomeRate'コードを含む)を見たいのですが、多分これはうまくいくかもしれません:

警告:エアコード。

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;
        }
    }
}

編集:データベースのラウンドトリップを避けるために積極的なロードの例を追加。

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


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ