Pregunta

Tengo el siguiente código:

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

Pero está fallando. Supongo que tiene algo que ver con el hecho de que estoy guardando una cadena.

Mi código Save () es este:

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

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

¿Deberían mis clases persistentes tener algo especial? ¿O puedo guardar casi cualquier cosa con db4o?

¿Fue útil?

Solución

Hasta donde yo sé, las primitivas de plataforma, aunque pueden ser tipos de referencia (como System.String), solo se almacenarán si una instancia es hija de otro objeto (es decir, referenciada en un campo) y luego ese objeto está almacenado. Por lo tanto, llamar a Store () en una primitiva en C # o Java no lo guardará. Básicamente, necesitará crear una entidad para hacer referencia a sus cadenas para guardarlas; de la misma manera que necesitaría crear una tabla para guardar cadenas en 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);

EDITAR: o mejor aún

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top