web-dev-qa-db-fra.com

Où est IDbSet <T> dans le noyau de l'entité

enter image description here

public abstract class RepositoryBase<T> : IRepository<T> where T : class
{
    private ShopCoreDbContext dbContext;
    private readonly DbSet<T> dbSet; //here
    protected IDbFactory DbFactory { get; private set; }
    protected ShopCoreDbContext DbContext
    {
        get => dbContext ?? (dbContext = DbFactory.Init());
    }
    protected RepositoryBase(IDbFactory dbFactory)
    {
        DbFactory = dbFactory;
        dbSet = DbContext.Set<T>();
    }
    public virtual T Add(T entity)
    {
        return dbSet.Add(entity); //err here
    } 
}

Avec IDbSet, rien ne se passe. Mais l'interface IDbSet n'existe plus dans le noyau de l'entité. C'est le détail de l'erreur:

ne peut pas implicitement convertir le type Microsoft.entityframeworkcore.changetracking.entityentry en T

Il faut que ce soit une interface.
Alors, que dois-je faire maintenant?

14
Thiện Sinh

Pour résoudre votre problème immédiat:

La méthode Add ne renvoie pas directement l'entité, mais une entité wrapper. Utilisez son .Entity propriété pour récupérer la valeur (ou renvoyer la valeur transmise):

    public virtual T Add(T entity)
    {
        return dbSet.Add(entity).Entity; 
    }

À propos de IDbSet<T> interface: Entity Framework Core n'a pas de IDbSet<T> interface.

Selon ce problème GitHub il n'est pas prévu de le récupérer depuis DbSet<T> est maintenant une classe de base abstraite qui peut être utilisée pour se moquer des tests ou être sous-classée:

Le problème avec les interfaces est que nous excluons les nouveaux membres ou que nous interrompons les personnes qui implémentent l'interface. La classe de base est également légèrement meilleure pour les personnes écrivant leurs propres doubles de test (plutôt que d'utiliser un cadre de simulation) car vous n'avez qu'à implémenter les méthodes que vous utilisez réellement.

[…]

Clôture car nous utilisons l'approche de type de base dans EF6.x pour quelques versions maintenant et nous n'avons entendu aucun retour sur des scénarios réels où cela ne fonctionne pas aussi bien.

23
Martin Ullrich