2

私は Entity Framework/Fluent API を使用していますが、それらは初めてです。私のシナリオでは、次の 3 つのクラスがあります。

public class Review
{
    public int Id { get; private set; }
    public float AverageRating { get; private set; } //Computed Field
    public int TotalLikes { get; private set; } //Computed Field
    public List<Rating> Ratings { get; private set;}
    public List<Like> Likes { get; private set;}
}
public class Rating
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
    public int Rating { get; set; }
}
public class Like
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
}

3 つのクラスすべてとそれらの関係に Fluent マッピングがあります。復習クラスには 2 つの計算フィールドがあります。子コレクション (Ratings と Likes) から計算フィールドを設定できます。その場合、Linq クエリに両方の子コレクションを含める必要がありますが、これはパフォーマンスを集中的に使用する操作であると考えています。または、DB で計算列を使用することもできます。しかし、データベース側に何かを入れるのは好きではありません。では、子コレクションをロードしたり、データベース ソリューションを使用したりせずに、計算フィールド (主に Count、Average などの集計操作) を設定する最良の方法は何でしょうか?

4

2 に答える 2

0

データベース ソリューションを使用せずに...

Linqにはcount/max/average、Sum、groupby、distinct ....などがあるため、DBが「計算」した後、カウントや合計整数などのデータを元に戻すことは通常問題ではありません。したがって、すべてのオブジェクトをドラッグして戻す必要はありません。

ポストバック時に整合性を維持するための並行性チェックの使用。ie Timestamp EF型Rowversion, 必要になります

基本的に EF では、コンテキストに値を入力し、保存します。したがって、覚えておくべき重要なことは、保存するとき、データに問題がないことを確認する方法です。それがRowversionの役割です。(楽観的ロック)

変更しようとしているレコードが、読み取った後変更されている場合は、失敗します。再読み取り/再計算して、もう一度やり直してください。

ただし、アプリケーションで悲観的ロックが必要な場合は、Ladislav のこの記事を読むことをお勧めします 。本質的に EF は悲観的ロックを提供していません。

ただし、EF で公開されているメソッドを使用して DB を呼び出すか、単に DB を呼び出すことができます。

Context.Database.ExecuteSqlCommand()

デフォルトでは、EF はダーティ データを読み取らないことに注意してください (つまり、コミットされていない読み取りはありません)。

結局のところ、データにアクセスするには悲観的ロック セマフォ スタイルが必要です。次に、SQL サーバーのアプリケーション ロックを参照してください。

はい、ENQUEUEサーバーが手元にない限り、DBが必要になります;-)

于 2013-06-27T15:03:28.180 に答える
0

ストアド プロシージャのようなデータベース ソリューションを使用したくない場合や、データベース側で計算列を使用したくない場合は、1 つのオプションが残されます。つまり、リポジトリにメソッドがあり、そのメソッドでGetRatings()linq クエリを使用して評価を計算します。もちろん、LINQ to Entities はその Linq クエリをネイティブ SQL クエリに変換します。これはデータベースにネイティブであるため、より高速です。 .

于 2013-06-27T13:33:39.367 に答える