4

私はこのようなコードを持っています:

Activity[] GetAllActivities() {
  using (ScheduleContext ctx = new ScheduleContext())
    return ctx.Activities.AsNoTracking().ToArray();
}

一部のデータの非常に単純なメモリ内キャッシュを作成する目的は、Activities必要なものすべてを要約したデータベースビューにマップされます。

返されたオブジェクトを省略する AsNoTrackingと、非決定論的に破損します。返されたオブジェクトのプロパティが正しく設定されておらず、1つのオブジェクトのプロパティ値が他のオブジェクトのプロパティに複製されることがよくあります。警告や例外はありません。EF4.3.1でもEF5rc2でもありません。CLR4と4.5リリース候補の両方が同じ動作を示します。

Activityオブジェクトは非常に単純です。int基本タイプ( 、など)の非仮想プロパティのみで構成され、stringキーも他のエンティティとの関係もありません。

これは予想される動作ですか?これに関するドキュメントはどこにありますか?

関連するものがなくなると、明らかに変更の追跡が機能しないことは理解していDbContextますが、マテリアライズされたプロパティが警告なしに破損していることに驚いています。私は主AsNoTrackingに、より複雑なシナリオのどこかを忘れて、いくぶんもっともらしいが間違った結果が得られるのではないかと心配しています。

編集:エンティティは次のようになります。Jonathan&Kristofに感謝します。IDとして推測される列が実際にあります!

public class Activity
{
  public string ActivityHostKey { get; set; }
  public int ActivityDuration { get; set; }
  public int ActivityLastedChanged { get; set; }
  public string ActivityId { get; set; }//!!!
  public string ModuleHostKey { get; set; }
  public string ModuleName { get; set; }
...
4

1 に答える 1

3

「あるオブジェクトのプロパティ値が他のオブジェクトのプロパティと重複することがよくある」と思いますActivity。ここでは、「キーがない」オブジェクトが重要な情報です(しゃれは意図されていません)。

ビュー(明らかに主キーがない)をインポートするとき、EFは主キーが何であるかを推測します。次に追跡を有効にすると、その主キーを使用して、各エンティティのコピーが1つだけメモリに作成されるようにします。これは、EFがPKであると推測したフィールドに同じ値を持つ2つの行をロードすると、2番目の行の値が最初の行を上書きすることを意味します。

「非決定論的に破損している」データに関しては、データベースが行が返される順序を保証しておらず、EFの「最後の勝利」プロセスであるため、レコードの順序がDBからの変更、その値を保持するようになるレコードも変更されます。

より多くの列を主キーの一部としてマークするか、ビュー(またはEDMXのDefiningQuery)を変更して、ROW_NUMBER関数に基づく列を含めて主キーとして使用できるようにしてください。

于 2012-07-07T13:02:33.663 に答える