显然,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;
但是,我没有看到这样做的机制。我错过了什么吗?
答案 0 :(得分:5)
我已经回答了这个here,但是还有其他问题。所以我再回答一下: 在db4o中,您通常没有ID。 db4o使用object-identity来区分对象。因此,内存中的同一对象将成为数据库的同一对象。
只要您没有序列化对象,这可以正常工作,您不需要任何ID。但是,只要对象被序列化/断开连接,这就不再适用了(典型的Web应用程序)。
我认为这三种选择是可能的:
IObjectContainer.Ext().GetID(object)
获取此ID。当然,你可以通过id获得一个对象:IObjectContainer.Ext().GetByID(id)
。然而,这个id不是永远的。对数据库进行碎片整理会更改此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访问。