2

どうやらdb4oのウェブサイトは最近やり直され、今では古い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;

しかし、それを行うためのメカニズムはわかりません。私は何かが足りないのですか?

4

2 に答える 2

5

私はすでにここでこれに答えましたが、他の質問と一緒に。したがって、私はもう一度答えます。db4oでは、通常、IDはありません。db4oは、object-identityを使用してオブジェクトを区別します。したがって、メモリ内の同じオブジェクトは、データベースの同じオブジェクトになります。

オブジェクトをシリアル化しない限り、これは正常に機能しますが、IDは必要ありません。ただし、オブジェクトがシリアル化/切断されるとすぐに、これは機能しなくなります(Webアプリの場合は一般的です)。

私はこの3つのオプションが可能だと思います:

  • db4o内部IDを使用します。このIDは。で取得できますIObjectContainer.Ext().GetID(object)。そしてもちろん、idでオブジェクトを取得できます:IObjectContainer.Ext().GetByID(id)。ただし、このIDは永久ではありません。データベースを最適化すると、このIDが変更されます。
  • db4oのUUIDを使用します。しかし、db4oUUIDは非常に大きいです
  • 自分でIDを作成します。たとえば、GUIDを使用します。または、賢いid-generatorを使用します。クエリで使用する場合は、このようなidフィールドにインデックスを付けることを忘れないでください。

もちろん、上記の実装のいずれかでidプロパティを提供する基本クラスを作成できます。

于 2010-01-25T16:33:03.630 に答える
0

さて、これが私がすぐにプロトタイプを作成したものであり、それは機能しているようです。まず、すべてのデータオブジェクトの基本クラスを作成しました。今のところ、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);
    }
}

したがって、オブジェクトをデータベースに格納するときは、StoreではなくStoreWithIdを呼び出すだけです。いくつかのテストは、これが機能していることを示しているようです。ここで私が目にする問題の1つは、最大値を持つオブジェクトを削除すると、同じIDを持つ2つのオブジェクトがありますが、両方が同時に存在しないことです。後で、おそらくStoreWithIdを介してのみアクセスされるデータベース自体にintインクリメントを格納することで、その答えを理解します。

于 2010-01-25T17:34:50.823 に答える