2009-10-23 5 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

내가 아는 한 플랫폼 primitive는 인스턴스가 다른 객체의 자식 (즉, 필드에서 참조 된) 인 경우에만 참조 유형 (예 : System.String)이 될 수 있지만 저장됩니다 개체가 저장됩니다. 따라서 Store()를 C# 또는 Java의 프리미티브에서 호출해도 저장되지 않습니다. 기본적으로 문자열을 저장하기 위해 문자열을 참조하는 엔티티를 만들어야합니다. 문자열을 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);