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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top