Question

J'ai posé une question un certain temps pourquoi le comparateur d'égalité par défaut ne semble pas fonctionner quand j'étais Unir deux collections d'entités.

code EF Première - LINQ to Entities Union EqualityComparer

La réponse est due au fait que j'utilisais deux cas de différence de mon DbContext donc différentes références.

Alors maintenant, je suis en train de partager mon DbContent sur la demande. Je vois quelques exemples « compliqué », mais je pensais que je vais essayer de trouver une solution plus simple.

Je créé une interface IDbContext qui décrit simplement mes entités

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

Mon DbContext est mise en œuvre alors comme ceci:

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

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

Ensuite, dans mes deux référentiels (NewsRepository et CategoryRespository) Je le IDbContext en tant que paramètre constructeur

IDbContext _db;

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

Alors maintenant, je suppose que si je lie IDbContext à SiteContext dans le cadre de la demande de mes dépôts partagent le même contexte?

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

Cependant, quand je fais de mon union à nouveau de la question précédente, je reçois toujours les entités en double! Qu'est ce que je fais mal? Comment puis-je savoir si j'utilise vraiment le même contexte dans une demande?

Était-ce utile?

La solution

Parce que quand chaque dépôt est construit Ninject va vous fournit une nouvelle instance de SiteContext par dépôt. C'est pourquoi sa ne fonctionne pas. Une bonne idée d'utiliser une implémentation UnitOfWork qui signifie que tous les dépôts utilisent le même contexte.
Le UnitOfWork prendrait dans un IDbContext sur la construction.

Quelque chose comme ceci fonctionnerait

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

Autres conseils

Pour améliorer la solution de feanz je encore faire l'injection de propriété du INewsRepository avec Ninject:

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

Chaque fois qu'un IUnitOfWork est créé il y a aussi un INewsRepository créé. Celle-ci doit encore être ajouté à vos fixations ninject.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top