关于使用db4o的一些问题

Max*_*Max 18 .net db4o

我正在尝试db4o对象数据库,到目前为止我非常喜欢我所看到的,但我也读过这篇关于stackoverflow db4o体验的帖子表明并非一切看起来如此简单都很容易.

现在,我对如何在现实世界的应用程序中使用db4o有一些疑问.因此,如果您有使用db4o工作的经验(特别是在Web应用程序上下文中),我很乐意听到它们.

这是我的问题:

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

    例如,如果我正在使用NHibernate/mysql并且需要通过id查找User对象,我会执行session.Load(primaryKey)并且它将被其PK检索.在表定义中将PK定义为自动增量也是很常见的.

  2. 由于db4o中没有这样的选项,我的想法是使用Guid结构来识别对象数据库中的一些对象.

  3. 有哪些工具可以在db中查看存储的对象?

    在db4o世界中是否存在类似SQL Server Management Studio(可能不太复杂)的东西?我想查看db文件中已存储的数据/对象.

  4. 重命名域对象时,你搞砸了吗?

    据我所知,当您重命名一个类时,无法再检索数据库中以前存储的任何实例.有办法解决这个问题吗?如何处理已包含许多对象的实时数据库的更新?

  5. 我可以将属性排除在保存到数据库之外吗?

    例如,如果一个域对象持有对(无状态)服务对象的引用,那么如果域对象被持久化,服务对象也将被持久化,对吧?

在数据库中保存服务实例似乎有点奇怪,至少对我而言.

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

Gam*_*lor 13

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

只要你不序列化对象,这工作正常.但是,只要对象被序列化/断开连接,这就不再起作用了.例如,在Web场景中:您将数据发送到浏览器.现在,您需要通过某些ID再次识别对象.

我认为这三个选项是可能的: - 使用db4o内部id.然而,这个id不是永远的.对数据库进行碎片整理会更改此ID.- 使用db4o的UUID.但是db4o UUID非常大 - 自己创建id

2)有一个对象管理器工具来查看数据库.然而,它目前的状态非常有限.在我看来,这是db4o的一个巨大缺点.

3)您可以创建别名,重命名类和字段等.但是,更改继承层次结构不起作用.然后,您需要将旧数据复制到新实例.

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