1

我有以下代码:

 Assert.IsTrue(Repository.FindAll<string>().Count() == 0);
 string newString = "New String";
 Repository.Save(newString);
 Assert.IsTrue(Repository.FindAll<string>().Count() == 1);

但它失败了。我想这与我正在保存一个字符串的事实有关。

我的 Save() 代码是这样的:

  public void Save<T>(T obj)
  {
     if (obj == null)
        throw new ArgumentNullException("obj not allowed to be null");

     Db.Store(obj);
     Db.Commit();
  }

我的持久课程应该有什么特别的吗?或者我可以用 db4o 保存几乎任何东西?

4

1 回答 1

3

据我所知,平台原语,即使它们可能是引用类型(如 System.String),只有在实例是另一个对象的子对象(即在字段中引用)然后存储该对象时才会存储。因此,在 C# 或 Java 中对原语调用 Store() 不会保存它。基本上,您需要创建一个实体来引用您的字符串以保存它们;与创建表以将字符串保存到 RDBMS 的方式非常相似。

公共类 StringEntity
{
   私有只读字符串值;

   公共 StringEntity(字符串值)
      : 根据()
   {
      this.value = 值;
   }
}

...

Assert.IsTrue(Repository.FindAll<StringEntity>().Count() == 0);
Repository.Save(new StringEntity("New String"));
Assert.IsTrue(Repository.FindAll<StringEntity>().Count() == 1);

编辑:或者更好

公共类 Primitive<T>
{
   私有只读 T 值;

   公共基元(T 值)
      : 根据()
   {
      this.value = 值;
   }
}

...

Assert.IsTrue(Repository.FindAll<Primitive<string>>().Count() == 0);
Repository.Save(new Primitive<string>("New String"));
Assert.IsTrue(Repository.FindAll<Primitive<string>>().Count() == 1);
于 2009-10-25T21:30:17.797 回答