Question

J'ai le code suivant:

 Assert.IsTrue(Repository.FindAll<string>().Count() == 0);
 string newString = "New String";
 Repository.Save(newString);
 Assert.IsTrue(Repository.FindAll<string>().Count() == 1);

Mais cela échoue. Je suppose que cela a quelque chose à voir avec le fait que je sauve une chaîne.

Mon code Save () est ceci:

  public void Save<T>(T obj)
  {
     if (obj == null)
        throw new ArgumentNullException("obj not allowed to be null");

     Db.Store(obj);
     Db.Commit();
  }

Mes classes persistantes doivent-elles avoir quelque chose de spécial? Ou je peux simplement économiser à peu près n'importe quoi avec db4o?

Était-ce utile?

La solution

Pour autant que je sache, les primitives de plate-forme, même si elles peuvent être des types de référence (comme System.String), ne seront stockées que si une instance est l'enfant d'un autre objet (c'est-à-dire référencé dans un champ), puis cet objet. est stocké. Par conséquent, appeler Store () sur une primitive en C # ou en Java ne l'enregistrera pas. Fondamentalement, vous devez créer une entité pour référencer vos chaînes afin de les enregistrer. de la même manière que vous auriez besoin de créer une table pour sauvegarder des chaînes dans un SGBDR.

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: ou mieux encore

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top