Db4O - Могу ли я сохранить строку? - PullRequest
1 голос
/ 24 октября 2009

У меня есть следующий код:

 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?

1 Ответ

3 голосов
/ 26 октября 2009

Насколько я знаю, примитивы платформы, даже если они могут быть ссылочными типами (например, System.String), будут храниться только в том случае, если экземпляр является дочерним по отношению к другому объекту (т.е. указан в поле), а затем этот объект хранится. Поэтому вызов Store () для примитива в C # или Java не сохранит его. По сути, вам нужно создать сущность для ссылки на ваши строки, чтобы сохранить их; почти так же, как вам нужно создать таблицу для сохранения строк в СУБД.

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);

EDIT: или еще лучше

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);
...