2

EFコードファーストで使用するこれら2つのPOCOクラスを検討してください。

public class Sale 
{
    public int SaleId { get; set; }
    public DateTime Date { get; set; }
    public double Amount { get; set; }
}

public class History
{
    public int HistoryId { get; set; }
    public DateTime Date { get; set; }
    public double Total { get; set; }
}

それはすべてうまくいっていますが、実際には、アプリケーションで使用しているときに、クラスがより多くを表すようにしたいです。

 public class SaleWithAllIWant
    {
        public int SaleId { get; set; }
        public DateTime Date { get; set; }
        public double Amount { get; set; }
        public double Calculation   // Read only and NOT stored in DB
        {
            get
            {
                // Obtain Total from _Context.History on Date
                // Perform Calculation
            }
        }
    }

EFの美しさを活かして、次のようなことができるようになりたいです。

gridSales.DataSource = _Context.Sales.ToList();

ただし、セールには私の情報がすべて含まれているわけではありません。SaleWithAllIWantはコンテキストではないので、SaleからSaleWithAllIWantにすべてを取得するには、なんらかのポストブッチャリングを行う必要があります。バインドされていない列などを使用できますが、乱雑になり、パフォーマンスに影響を及ぼし始めます。

計算には履歴コンテキストの知識が必要なため、SaleWithAllIWantをPOCOクラスに入れることはできません。私のDALプロジェクト(DbSetを作成する)は私のモデルプロジェクト(POCOクラスを保持する)を参照します。そのため、モデルプロジェクトは、循環参照であるため、コンテキストにアクセスするためにDALを参照できません。

個別のDALプロジェクトとモデルプロジェクトを持たずに、すべてをまとめるだけの解決策はありますか?

私が行方不明になっているより良い方法があると思います。すべてのコメントは大歓迎です。

4

1 に答える 1

1

DAL とモデルを一緒にマージすることは、それらを個別に展開していない場合に検討するオプションです。

とはCalculationいえ、拡張メソッドの優れた候補のように見えます。

public static class SaleExtensions
{
    public static double Calculation(this Sale sale)        
    {
            // Obtain Total from _Context.History on Date
            // Perform Calculation
    }
}

これは、DAL プロジェクトに含めることができます。計算を行う目的で追加のプロパティを Sale に保持する必要がある場合は、[NotMapped]EF がそれらを無視するようにそれらをマークするだけです。

于 2012-11-24T13:48:47.947 に答える