Domanda

Ho fatto una domanda un po 'indietro sul perché il confronto uguaglianze predefinito non sembra funzionare quando ero sindacali due collezioni di entità.

EF Codice Prima - LINQ to Entities dell'Unione EqualityComparer

La risposta è stata dovuta al fatto che stavo usando due istanze di differenza di mia DbContext quindi diversi riferimenti.

Così ora sto cercando di condividere la mia DbContent tutta la richiesta. Vedo alcuni esempi "complicato", ma ho pensato di provare per una soluzione più semplice.

Così ho creato un'interfaccia IDbContext che delinea semplicemente i miei Enti

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

Il mio DbContext viene poi implementare in questo modo:

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

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

Poi, nei miei due repository (NewsRepository e CategoryRespository) ho l'IDbContext come costruttore parametro

IDbContext _db;

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

Ora presumo che se mi legano a IDbContext SiteContext nel campo di applicazione richiesta di mio repository condivideranno lo stesso contesto?

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

Tuttavia, quando provo di nuovo la mia unione dalla domanda precedente ho ancora ricevuto le entità duplicate! Quello che sto facendo male? Come faccio a sapere se sto sicuramente usando lo stesso contesto in una richiesta?

È stato utile?

Soluzione

Perché quando ogni repository è costruito Ninject vi sta fornendo voi con una nuova istanza di SiteContext per ogni repository. Ecco perché la sua non funziona. E 'una buona idea di utilizzare un'implementazione unitofwork il che significa che tutti i repository utilizzano lo stesso contesto.
L'UnitOfWork prenderebbe in un IDbContext sulla costruzione.

Qualche cosa come questa funzionerebbe

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;
         }    
}

Altri suggerimenti

Per migliorare la soluzione di feanz vorrei ancora fare l'iniezione di proprietà del INewsRepository con Ninject:

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

Ogni volta che viene creato un IUnitOfWork c'è anche un INewsRepository creato. Questo deve ancora essere aggiunto ai tuoi attacchi Ninject.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top