0

私はこの Entity Framework Object Services Overview (Entity Framework)に非常に慣れていないため、ここで間違った用語を使用した場合はご容赦ください。

EDMX ファイルを使用して SQLite データベースに接続しています。私がやろうとしているのはObjectSet<T>、データベース内のテーブルからオブジェクトのコレクションにアクセスするために、通常どおりに使用することです。ただし、そのセット内のオブジェクトに実行時のみのデータを追加で保存したいと考えています。私の場合、データベースに一連のデバイスが保存されていますが、起動時にそれらを「接続済み」または「切断済み」としてマークし、実行中にこの状態を追跡したいと考えています。

EDMX によって生成される (行) 型は、partial別の部分的な定義を追加し、public bool Connectedそこにプロパティを追加したためです。これ機能しているようで、設定できます。将来のクエリは、以前に設定した値と同じ値を持つオブジェクトを提供します。問題は、a) どのように機能しているか、b) 信頼できるかどうかわからないことです。これらの疑問は、これらが実際には私たちが扱っているオブジェクトのコレクションではないという事実から来ていますよね?

うまくいけば、それが理にかなっています。そうでなければ、より詳細を提供できます。

4

1 に答える 1

2

あなたがしていることは完全に安全です。

ObjectSet は依然としてオブジェクトのコレクションです。下にたくさんの魔法が追加されています。私は内部構造の専門家ではありませんが、これがどのように機能すると思いますか:

Entity Framework には、操作しているすべてのエンティティを追跡する StateTracker ハットがあります。

EDMX モデルのすべてのクラスにキーが必要です。EF はそのキーを内部的に使用しているため、その特定のオブジェクトがメモリに1 回だけ読み込まれます。

var foo = db.Foos.Single(x => x.Id == 1); // foo with Id 1 is unique (in memory)
var foo2 = db.Foos.Single(x => x.Id == 1); // same instance of foo, but with updated values
var foo3 = db.Foos.Single(x => x.Id == 2) // a new unique instance (Id = 2)

bool sameObject = Object.Equals(foo, foo2); // will return true;

選択するたびに、次のことが起こります。

クラス Foo のインスタンスは既に追跡されていますか、または既に存在していますか?

はい -> データベースから既存のインスタンスのプロパティを更新します。
いいえ -> クラス Foo の新しいインスタンスを作成します (データベースから値を取得します)

もちろん、マップされたプロパティのみを更新できます。したがって、部分クラスで定義したものは上書きされません。

最初にコードを使用する場合。[NotMapped]コードの最初のモデルから新しいデータベースを生成する場合に、プロパティがテーブルに含まれないようにする属性もあります。

私はあなたのためにいくつかのことを明確にすることができれば幸いです.

于 2012-06-12T19:10:38.843 に答える