Db4O - Posso salvare una stringa?
-
06-07-2019 - |
Domanda
Ho il seguente codice:
Assert.IsTrue(Repository.FindAll<string>().Count() == 0);
string newString = "New String";
Repository.Save(newString);
Assert.IsTrue(Repository.FindAll<string>().Count() == 1);
Ma sta fallendo. Suppongo che abbia qualcosa a che fare con il fatto che sto salvando una stringa.
Il mio codice Save () è questo:
public void Save<T>(T obj)
{
if (obj == null)
throw new ArgumentNullException("obj not allowed to be null");
Db.Store(obj);
Db.Commit();
}
Le mie lezioni persistenti dovrebbero avere qualcosa di speciale? O posso semplicemente salvare praticamente qualsiasi cosa con db4o?
Soluzione
Per quanto ne so, le primitive della piattaforma, anche se possono essere tipi di riferimento (come System.String), verranno archiviate solo se un'istanza è figlia di un altro oggetto (ovvero referenziata in un campo) e quindi quell'oggetto è memorizzato. Pertanto, chiamare Store () su una primitiva in C # o Java non lo salverà. Fondamentalmente, dovrai creare un'entità per fare riferimento alle tue stringhe per salvarle; più o meno allo stesso modo in cui dovresti creare una tabella per salvare le stringhe in un 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);
EDIT: o meglio ancora
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);