質問

次のコードがあります:

 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でほとんど何でも保存できますか?

役に立ちましたか?

解決

私が知る限り、プラットフォームプリミティブは、参照型(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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top