代码之家  ›  专栏  ›  技术社区  ›  Miguel Ping

db4o-我可以保存一个字符串吗?

  •  1
  • Miguel Ping  · 技术社区  · 15 年前

    我有以下代码:

     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保存很多东西?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Travis Heseman    15 年前

    据我所知,平台原语,即使它们可能是引用类型(如system.string),也只会在实例是另一个对象(即在字段中引用)的子对象,然后存储该对象的情况下存储。因此,调用C或Java中的原语调用StureE()不能够保存它。基本上,为了保存字符串,您需要创建一个引用字符串的实体;这与您需要创建一个表以便将字符串保存到RDBMS的方式非常相似。

    public class StringEntity
    {
       private readonly string value;
    
       public StringEntity(string value)
          : base()
       {
          this.value = value;
       }
    }
    
    ...
    
    Assert.IsTrue(Repository.FindAll<StringEntity>().Count() == 0);
    Repository.Save(new StringEntity("New String"));
    Assert.IsTrue(Repository.FindAll<StringEntity>().Count() == 1);
    

    编辑: 或者更好

    public class Primitive<T>
    {
       private readonly T value;
    
       public Primitive(T value)
          : base()
       {
          this.value = value;
       }
    }
    
    ...
    
    Assert.IsTrue(Repository.FindAll<Primitive<string>>().Count() == 0);
    Repository.Save(new Primitive<string>("New String"));
    Assert.IsTrue(Repository.FindAll<Primitive<string>>().Count() == 1);