2

显然 db4o 网站最近重做,现在旧网址出现 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 使用对象标识来区分对象。所以内存中的同一个对象将是数据库的同一个对象。

只要您不序列化对象,它就可以正常工作,您不需要任何 ID。但是,一旦对象被序列化/断开连接,这将不再起作用(典型的网络应用程序)。

我认为这三个选项是可能的:

  • 使用 db4o内部标识。您可以使用IObjectContainer.Ext().GetID(object). 当然,您可以通过 id: 获取对象IObjectContainer.Ext().GetByID(id)。然而,这个 id 不是永远的。对数据库进行碎片整理会更改此 ID。
  • 使用 db4o 的UUID。但是 db4o UUID 非常大
  • 自己创建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);
    }
}

所以现在当我在数据库中存储一个对象时,我将只调用 StoreWithId 而不是 Store。一些测试似乎表明这是有效的。现在我看到的一个问题是,如果我删除具有最大值的对象,我将拥有两个具有相同 ID 的对象,但它们并不同时存在。稍后我会找出答案,可能只是在数据库本身中存储一个只能通过 StoreWithId 访问的 int 增量器。

于 2010-01-25T17:34:50.823 回答