2009-10-23 30 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); 
相關問題