db4o,Linq和UUID

时间:2010-01-25 15:04:34

标签: linq uuid db4o

显然,db4o网站最近重做了,现在旧网址发出404错误。每次我认为我找到了答案,我都会收到404错误。

我有一个简单的db4o数据库,我已经设置了存储人员。

public class Person
{
     public string Firstname { get; set;}
     public string Lastname {get;set;}
}

我已经能够在数据库上运行Linq查询,一切都运行得非常好。我正在网络环境中编程,所以我需要有人从数据库中识别和获取唯一对象,所以我只是将数据库配置为使用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;
但是,我没有看到这样做的机制。我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

我已经回答了这个here,但是还有其他问题。所以我再回答一下: 在db4o中,您通常没有ID。 db4o使用object-identity来区分对象。因此,内存中的同一对象将成为数据库的同一对象。

只要您没有序列化对象,这可以正常工作,您不需要任何ID。但是,只要对象被序列化/断开连接,这就不再适用了(典型的Web应用程序)。

我认为这三种选择是可能的:

  • 使用db4o internal id。您可以使用IObjectContainer.Ext().GetID(object)获取此ID。当然,你可以通过id获得一个对象:IObjectContainer.Ext().GetByID(id)。然而,这个id不是永远的。对数据库进行碎片整理会更改此ID。
  • 使用db4o的UUIDs。但是db4o UUID非常大
  • 自己创建ID。例如,使用GUID。或using a clever id-generator。记得在use it in queries时为这样的id字段编制索引。

当然,您可以创建一个基类,它为上面的任何实现提供了id-property。

答案 1 :(得分: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);
    }
}

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