我正在尝试db4o对象数据库,到目前为止,我非常喜欢我所看到的内容,但是我还阅读了关于stackoverflow db4o experiences?的文章,指出并非所有看起来如此简单的事情都是容易的。

现在,我对在实际应用中如何使用db4o有一些疑问。因此,如果您有使用db4o的经验(尤其是在Web应用程序上下文中),那么我很想听听他们的意见。

这是我的问题:


使用db4o存储的对象时如何管理对象标识?**
从RDBMS背景开始,您通常通常对每个表都有一个主键/标识列,我现在无法想象如何在db4o中管理对象标识。

例如,如果我正在使用NHibernate / mysql,并且需要通过id查找User对象,那么我将执行session.Load(primaryKey),它将通过其PK进行检索。在表定义中将PK定义为自动递增也是很常见的。
由于db4o中没有这样的选项,因此我想到使用Guid结构来标识对象数据库中的某些对象。
有什么工具可以查看数据库中存储的对象吗?

db4o世界中是否有类似SQL Server Management Studio的东西(可能不太复杂)?我想查看db文件中已经存储的数据/对象。
重命名域对象时,您是否感到困惑?

据我所知,当您重命名一个类时,无法再检索数据库中以前存储的任何实例。有没有解决此问题的方法?您如何处理已经包含许多对象的实时数据库的更新?
是否可以将属性从保存到数据库中排除?

例如,如果一个域对象持有对(无状态)服务对象的引用,那么如果该域对象被保留,则该服务对象也将被保留,对吗?


至少在我看来,将服务实例保存在数据库中似乎有些奇怪。

您可以将服务实例从保存中排除吗?如果再次检索域对象,如何确保该服务也再次注入实例中?

最佳答案

1)使用db4o存储的对象时如何管理对象标识?
在db4o中,通常没有ID。 db4o使用object-identity区分对象。因此,内存中的同一对象将成为数据库的同一对象。

只要不对对象进行序列化,就可以正常工作。但是,一旦对象被序列化/断开连接,这将不再起作用。例如,在一个网络场景中:您将数据发送到浏览器。现在,您需要稍后通过一些ID再次标识对象。

我认为这三种选择是可能的:
-使用db4o internal id。但是,此ID不会永远存在。对数据库进行碎片整理会更改此ID。
-使用db4o's UUIDs。但是db4o UUID很大
-自己创建ID

2)有一个对象管理器工具可以查看数据库。但是,它的当前状态极为有限。在我看来,这对于db4o是一个巨大的缺点。

3)您可以创建aliases, rename classes and fields etc。但是,更改继承层次结构不起作用。然后,您需要将旧数据复制到新实例。

4)是的。您可以使用.NET-NonSerialized属性或自定义属性将字段标记为transient

关于.net - 有关使用db4o的几个问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1620355/

10-10 02:17