Sto usando il generic repository
pattren in un'app ef
5. esiste un metodo create()
in IDbSet
, che in DbSet di DbSet
non esiste.
la descrizione del metodo Create()
in EF5 è la seguente:
Crea una nuova istanza di un'entità per il tipo di questo set. Nota che questa istanza NON è stata aggiunta o allegata al set. L'istanza restituita sarà un proxy se il contesto sottostante è configurato per creare proxy e il tipo di entità soddisfa i requisiti per la creazione di un proxy.
Esempio di codice:
public interface IRepository<T> where T : IDisposable {
T Create();
}
public class Repository<T> : IRepository<T> where T : IDisposable {
protected IUnitOfWork uow;
protected IDbSet<T> entity;
public Repository(IUnitOfWork uow) {
this.uow = uow;
this.entity = uow.Set<T>();
}
public T Create() {
return entity.Create();
}
}
la mia domanda è, perché Create();
il metodo viene rimosso in DbSet di DbSet
(si noti che IDbSet
viene rimosso anche nel core EF)
e ho trovato questa domanda: Create () Versus new T () , ho qualche problema in futuro se uso la nuova T ()?
Quello che ho trovato è che il motivo per cui tali metodi non sono implementati è che Entity Framework Core (EF7) non utilizza affatto i proxy. Quindi il valore aggiunto per tali metodi (che crea un proxy per un'entità) non esiste più. Secondo me il costruttore predefinito di un'entità è la strada da percorrere.
Vedi la discussione: https://github.com/aspnet/EntityFramework/issues/3797
Ora che EF Core supporta proxy e caricamento lento , esiste un metodo di estensione DbSet.CreateProxy()
. Sembra che abbiano cambiato il nome per rendere più chiaro che il suo unico scopo è quello di creare un proxy.