2009-10-23 31 views
1

我有以下代码:Db4O - 我可以保存一个字符串吗?

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

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

我保存()的代码是这样的:

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

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

如果我的持久化类有一些特别的东西?或者我可以使用db4o保存几乎任何东西?

回答

3

就我所知,即使它们可能是引用类型(如System.String),平台原语只会在实例是另一个对象的子元素(即在字段中引用)时才存储,然后对象被存储。因此,在C#或Java的原语上调用Store()将不会保存它。基本上,你需要创建一个实体来引用你的字符串以保存它们;与为了将字符串保存到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); 
相关问题