Вопрос

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

 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), будут сохранены только в том случае, если экземпляр является дочерним по отношению к другому объекту (т. Е.ссылка в поле), а затем этот объект сохраняется.Следовательно, вызов 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top