显然 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;
但是,我没有看到执行此操作的机制。我错过了什么吗?
Apparently the db4o website was recently redone, and now old urls are giving 404 errors. Everytime I think I've found the answer, I get a 404 error.
I have a simple db4o database I've setup to store people.
public class Person
{
public string Firstname { get; set;}
public string Lastname {get;set;}
}
I've been able to run Linq queries on the database, and everything works wonderfully. I'm programming in a web environment, so I will need someone to identify and fetch unique objects from the database, so I simply configured the database to use UUID's. Now the problem has become, how can I get to the UUID information from the objects I get from the Linq query?
For example, let's say I get all the people stored in the database, and I need to generate the unique URL's for each person. I will use the UUID to do so. So I'll run this:
var people = (from Person p in db select p).ToList();
And then I'll iterate through the list
foreach( Person person in people)
{
DoSomething(person);
}
The best solution would be making the UUID a property on the Person class, so that I could just:
var uuid = person.UUID;
I don't see a mechanism for doing that however. Am I missing something?
发布评论
评论(2)
我已经在此处回答了这个问题,但与其他问题一起回答了。所以我再次回答:
在 db4o 中通常没有 id。 db4o 使用 对象标识 来区分对象。因此,内存中的同一个对象对于数据库来说也是同一个对象。
只要你不序列化对象,它就可以正常工作,你不需要任何 ID。然而,一旦对象被序列化/断开连接,这就不再起作用(典型的网络应用程序)。
我认为这三个选项都是可能的:
IObjectContainer.Ext().GetID(object)
获取此 ID。当然,您可以通过 id 获取对象:IObjectContainer.Ext().GetByID(id)
。然而这个id并不是永远的。对数据库进行碎片整理会更改此 ID。当然,您可以创建一个基类,为上述任何实现提供 id 属性。
I've answered this already here but together with other question. Therefore I answer it again:
In db4o you have normally no id. db4o uses the object-identity to distinguish the object apart. So the same object in memory is going to be the same object for the database.
As long a you don't serialize object this works fine, you don't need any ID. However as soon as objects are serialized / disconnected this doesn't work anymore (Typical for web-apps).
I think this three options are possible:
IObjectContainer.Ext().GetID(object)
. And of course you can get a object by id:IObjectContainer.Ext().GetByID(id)
. However this id isn't forever. Defragmenting the database changes this id.Of course you can create a base-class which provides the id-property with any of the implementations above.
好的,这就是我快速制作的原型,而且看起来很有效。首先,我为所有数据对象创建了一个基类。现在,它只有一个 int Id 字段,尽管我可能也会将它用于其他一些事情。
然后我在 IObjectContainer 上创建了一个扩展方法。
因此,现在当我在数据库中存储对象时,我将只调用 StoreWithId 而不是 Store。一些测试似乎表明这是有效的。现在我看到的一个问题是,如果我删除具有最大值的对象,我将拥有两个具有相同 id 的对象,但它们不会同时存在。稍后我会找出答案,可能只是在数据库本身中存储一个只能通过 StoreWithId 访问的 int 增量器。
Okay, here's what I've prototyped quickly, and it seems to be working. First, I created a base class for all my data objects. Right now, all it has is an int Id field, though I will probably use it for some other things as well.
Then I created an extension method on IObjectContainer.
So now when I store an object in the db, I'll just call StoreWithId instead of Store. A few tests seem to show this is working. Now one problem I see is if I delete the object with the max value, I'll have two objects with identical id's, but which both don't exist at the same time. I'll figure out the answer to that later, possibly by just storing an int incrementer in the database itself that's only ever accessed through StoreWithId.