質問
どうやら db4o Web サイトが最近やり直されたようで、古い URL では 404 エラーが発生するようになりました。答えが見つかったと思うたびに、404 エラーが発生します。
私は人を保存するためにセットアップした単純な db4o データベースを持っています。
public class Person
{
public string Firstname { get; set;}
public string Lastname {get;set;}
}
データベース上で Linq クエリを実行することができ、すべてがうまく機能しています。私は Web 環境でプログラミングしているため、データベースから一意のオブジェクトを識別して取得する人が必要になるため、UUID を使用するようにデータベースを構成しました。ここで問題は、Linq クエリから取得したオブジェクトから UUID 情報を取得するにはどうすればよいでしょうか?
たとえば、データベースに保存されているすべての人物を取得し、各人物に一意の URL を生成する必要があるとします。これには UUID を使用します。それで、これを実行します:
var people = (from Person p in db select p).ToList();
それからリストを繰り返し処理します
foreach( Person person in people)
{
DoSomething(person);
}
最善の解決策は、UUID を Person クラスのプロパティにして、次のことを実行できるようにすることです。
var uuid = person.UUID;
ただし、それを行うためのメカニズムは見当たりません。何かが足りないのでしょうか?
解決
これにはすでに答えています ここ しかし、他の質問と一緒に。したがって、私はもう一度答えます:db4o では通常 ID がありません。db4o は オブジェクトのアイデンティティ 物体を区別すること。したがって、メモリ内の同じオブジェクトはデータベースでも同じオブジェクトになります。
オブジェクトをシリアル化しない限り、これは正常に動作し、ID は必要ありません。ただし、オブジェクトがシリアル化/切断されるとすぐに、これは機能しなくなります (Web アプリでは一般的です)。
この 3 つの選択肢が考えられます。
- db4o を使用する 内部ID. 。このIDは次のように取得できます
IObjectContainer.Ext().GetID(object)
. 。もちろん、ID によってオブジェクトを取得することもできます。IObjectContainer.Ext().GetByID(id)
. 。ただし、この ID は永遠ではありません。データベースをデフラグすると、この ID が変更されます。 - db4o の使用 UUID. 。ただし、db4o UUID は非常に大きいです
- IDは自分で作成します。たとえば、GUID を使用します。または 賢いIDジェネレーターを使用する. 。次の場合は、そのような ID フィールドにインデックスを付けることを忘れないでください。 クエリで使用します.
もちろん、上記の実装のいずれかを使用して id プロパティを提供する基本クラスを作成することもできます。
他のヒント
さて、ここで私はすぐに試作きたものだし、それが動作しているようです。まず、私はすべてのデータオブジェクトの基本クラスを作成しました。私はおそらく同様に、いくつかの他のもののためにそれを使用しますけれども、今、それが持っているすべては、int型Idフィールドです。
その後、私はIObjectContainer上の拡張メソッドを作成します。
public static class db4oExtensions
{
public static void StoreWithId(this Db4objects.Db4o.IObjectContainer db, DataObject dao)
{
int count = (from DataObject datao in db select datao.Id).Max();
dao.Id = count + 1;
db.Store(dao);
}
}
私はDBにオブジェクトを格納するとき、だから今、私はちょうどStoreWithId代わりの店を呼ぶことにします。いくつかのテストでは、これが作動していることが示されているように見えます。今、私が見る一つの問題は、私は最大値を持つオブジェクトを削除した場合、私は同じIDの2つのオブジェクトがあるでしょうが、その両方が同時に存在していないです。私はちょうどしかStoreWithIdを介してアクセスしていますデータベース自体のintのインクリメンタを格納することで、おそらく、後からその答えを見つけ出すでしょう。