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
}
}
Con IDbSet non succede nulla. Ma l'interfaccia IDbSet non esiste più nel core dell'entità. Questo è il dettaglio dell'errore:
non è possibile convertire implicitamente il tipo Microsoft.entityframeworkcore.changetracking.entityentry in T
Richiede che deve essere un'interfaccia.
Quindi cosa dovrei fare ora?
Per risolvere il tuo problema immediato:
Il metodo Add
non restituisce direttamente l'entità, ma un'entità wrapper. Usa la sua proprietà .Entity
per recuperare il valore (o restituire il valore passato):
public virtual T Add(T entity)
{
return dbSet.Add(entity).Entity;
}
Informazioni IDbSet<T>
: Entity Framework Core non ha un'interfaccia IDbSet<T>
.
Secondo questo problema di GitHub non esiste un piano per riportarlo indietro poiché DbSet<T>
è ora una classe di base astratta che può essere usata per prendere in giro test o sottoclassi:
Il problema con le interfacce è l'esclusione di nuovi membri o la rottura di persone che implementano l'interfaccia. La classe base è anche leggermente migliore per la gente che scrive i propri duplicati di test (piuttosto che usare un framework di simulazione) poiché è necessario solo implementare i metodi effettivamente utilizzati.
[Â € |]
Chiusura poiché abbiamo utilizzato l'approccio di tipo base in EF6.x per alcune versioni e non abbiamo ancora ricevuto alcun feedback sugli scenari reali in cui ciò non funziona.