Db4O - Могу ли я сохранить строку?
-
06-07-2019 - |
Вопрос
У меня есть следующий код:
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);