Pregunta

Hace un tiempo, hice una pregunta sobre por qué el comparador de igualdad predeterminado no parecía funcionar cuando era unión dos colecciones de entidades.

Código EF Primero - Linq a Entities Union IgualityComparer

La respuesta se debió al hecho de que estaba usando dos instancias de diferencia de mi DBContext, por lo tanto, diferentes referencias.

Así que ahora estoy tratando de compartir mi DBContent en la solicitud. Veo algunos ejemplos "complicados", pero pensé en intentar una solución más simple.

Entonces creé una interfaz IdbContext que simplemente describe mis entidades

public interface IDbContext {
   int SaveChanges();
   DbSet<News> News { get; set; }
   DbSet<Category> Categories { get; set; }
}

Mi dbContext se implementa así:

public class SiteContext : DbContext, IDbContext {
   public DbSet<News> News { get; set; }
   public DbSet<Category> Categories { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      ...
   }
}

Luego, en mis dos repositorios (NewsRepository y CategoryRespository) tengo el IdbContext como parámetro de constructor

IDbContext _db;

public NewsRepository(IDbContext db) {
    _db = db;
}

Entonces, ahora supongo que si encuentro idbContext a SitEcontext en el alcance de la solicitud, ¿mis repositorios compartirán el mismo contexto?

 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();

Sin embargo, cuando intento mi sindicato nuevamente de la pregunta anterior, ¡todavía recibo entidades duplicadas! ¿Que estoy haciendo mal? ¿Cómo puedo saber si definitivamente estoy usando el mismo contexto en una sola solicitud?

¿Fue útil?

Solución

Porque cuando se construya cada repositorio, Ninject le proporcionará una nueva instancia de SitEcontext por repositorio. Por eso no está funcionando. Es una buena idea usar una implementación de UnitOfwork, lo que significa que todos los repositorios usan el mismo contexto.
La unidad de trabajo tomaría un IDBContext en la construcción.

Algo como esto funcionaría

private IDbContext _context;

public UnitOfWork(IDbContext context)
{
    _context = context
}

private _INewsRepository;
public INewsRepoitory 
{
    get{
         if(_INewsRepository == null)
         {
              _INewsRepository = new NewsREpository(_context);
              return _INewsRepository;
         }
         else
         {
              return _INewsRepository;
         }    
}

Otros consejos

Para mejorar la solución de Feanz, todavía haría la inyección de propiedad del Inewsrepository con Ninject:

[Inject]
public INewsRepository NewsRepo {get;set;}

Cada vez que se crea un IunitofWork, también se crea un InewsPropository. Esto aún debe agregarse a sus enlaces ninguno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top