Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
db4o、Linq和UUID_Linq_Uuid_Db4o - Fatal编程技术网

db4o、Linq和UUID

db4o、Linq和UUID,linq,uuid,db4o,Linq,Uuid,Db4o,显然,db4o网站最近被重做了,现在旧的url给出了404个错误。每次我认为我已经找到了答案,我得到一个404错误 我有一个简单的db4o数据库,用来存储人 public class Person { public string Firstname { get; set;} public string Lastname {get;set;} } 我已经能够在数据库上运行Linq查询,并且一切都运行得非常好。我在一个web环境中编程,所以我需要有人从数据库中识别和获取唯一的对

显然,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;

然而,我没有看到这样做的机制。我遗漏了什么吗?

我已经回答了这个问题,但还有其他问题。因此,我再次回答: 在db4o中,通常没有id。db4o使用id来区分对象。因此,内存中的同一对象将是数据库中的同一对象

只要您不序列化对象,这就可以正常工作,您不需要任何ID。但是,一旦对象序列化/断开连接,这就不再适用于web应用程序

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

使用db4o。您可以使用IObjectContainer.Ext.GetIDobject获取此id。当然,您可以通过id获取对象:IObjectContainer.Ext.GetByIDid。然而,这个id不是永远的。对数据库进行碎片整理会更改此id。 使用db4o。但是db4o uuid相当大 自己创建ID。例如,使用GUID。或请记住在创建时为此类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);
    }
}

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

谢谢,但我认为您没有抓住要点。我已经决定使用UUID,但不幸的是,在从Linq查询中获取对象后,无法找到找到UUID的方法。我找到的文档使用了不同类型的查询来获取UUID。我使用了db.Ext.getObjectInfo.GetUUID;这是可行的,但正如你所指出的,UUID在这里是非常实用的。我想我必须咬紧牙关,实现hilo算法。哦,对不起。是的,您可以通过“db.Ext.GetObjectInfoobject.GetUUID”获取db4o uuid,并通过“db.Ext.GetByUUID”获取对象。它不依赖于查询类型。是的,我应该更多地关注句子,例如使用GUID。在你最初的帖子中。实际上,我刚刚意识到使用.NET guid可能是一个更好的解决方案,首先转换为字符串以避免任何装箱/拆箱问题。进一步考虑后,我看到了显而易见的一点:使用guid来处理我的对象本来可以从.btw开始避免所有这些麻烦。因为db4o应该正确地处理db4o 7.12 guid。没有奇怪的装箱/拆箱问题。同样,您的答案中的实现也会出现并发问题。