Frage

Ich habe den folgenden Code:

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

Aber es versagt. Ich nehme an, es hat etwas mit der Tatsache zu tun, dass ich eine Zeichenfolge bin zu speichern.

Meine Save () Code ist dies:

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

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

Wenn meine persistenten Klassen haben etwas Besonderes? Oder ich kann nur so ziemlich alles mit db4o speichern?

War es hilfreich?

Lösung

Soweit ich weiß, Plattform Primitiven, obwohl sie Referenztypen sein können (wie System.String), wird nur dann gespeichert, wenn eine Instanz ein Kind eines anderen Objekts ist (dh in einem Feld verwiesen wird) und dann das Objekt wird gelagert. Daher Shop () aufrufen, auf einem primitiven in C # oder Java wird es nicht speichern. Grundsätzlich müssen Sie eine Einheit schaffen, die Saiten, um zu verweisen, sie zu retten; viel die gleiche Weise, wie Sie eine Tabelle, um Strings erstellen müssen zu einem RDBMS zu speichern.

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: oder noch besser

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top