ASP.NET 5 MVC 6 Modello di deposito generico

asp.net-core asp.net-core-mvc c# entity-framework-core

Domanda

Ho cercato ogni dove per un tutorial o qualcosa del genere.

Ho cercato di implementare il mio vecchio modello di repository generico per MVC5 in un nuovo progetto MVC6.

Ho creato 3 libreria di classi di .Core , .Data e .Service , tuttavia c'è un problema con IDBset , sembra la mia IntelliSense non piace, ho provato ad aggiungere System.Data e Entity Framework 6, ma senza alcuna fortuna (Cant trovarlo ... confondendo).

Dopo il roaming google ho deciso di chiedere qui, c'è un tutorial con il modo corretto o qualcuno può lanciare un pattern MVC6 generico di repository molto semplice? Ho la sensazione che il vecchio metodo di farlo potrebbe essere cambiato, ma non riesco a trovare alcuna informazione oltre alla DI incorporata.

Codice: la mia interfaccia IDbContext

IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity;

non vede IDbSet , questo semplicemente a causa di Entity Framework? Ho i riferimenti ad esso.

Il problema potrebbe essere non riesco a trovare la statizzazione using per l'entità framework.

AGGIORNARE:

Utilizzo di Entity framework 8.0.0 beta. Modificare tutti i riferimenti IDbset a DbSet.

Comunque nel mio repository generico dove uso metodi come:

public virtual T GetById(object id)
{
    return this.Entities.Find(id);
}

"Trova" non è un metodo. e non posso più usare "DbEntityValidationException" nelle mie catture.

Risposta accettata

Entity Framework 7 Beta 8 non viene fornito con il metodo di ricerca. Probabilmente verrà aggiunto prima della versione finale.

Dovrai invece utilizzare il metodo FirstOrDefault fino a quando ciò non accadrà

public virtual T GetById(int id)
{
    return this.Entities.FirstOrDefault(x => x.Id == id);
}

Poiché la proprietà Id non verrà riconosciuta, dovrai aggiungere un'interfaccia e farla implementare dal tuo repository.

public interface IEntity
{
     int Id { get; set; }
}

per esempio

 public class GenericRepository<T> : IGenericRepository<T> where T: class, IEntity

Dalla lista dei problemi di github . EF7 non esegue la convalida automatica dei dati, pertanto DbEntityValidationException non esiste in EF7.

Prendi nota: EF7 non è un aggiornamento di EF ma una riscrittura.


Risposta popolare

Al contrario della risposta di firste, non sono sicuro di usare FirstOrDefault, poiché genererà un SELECT TOP 1 [...].

In molti casi, l'Id dovrebbe essere univoco, ma a volte è possibile avere Db progettati male. In caso contrario, l'applicazione dovrebbe generare un'eccezione (questo è ciò che stiamo cercando).

Quindi, finché EF7 non implementa un metodo Find (), consiglio vivamente di utilizzare SingleOrDefault () :

public virtual T GetById(int id)
{
    return this.Entities.SingleOrDefault(x => x.Id == id);
}

In questo modo, aggiungi un controllo dell'applicazione per verificare che l'Id sia univoco, senza preoccuparti se il Db è fatto correttamente o meno. Aggiunge un altro livello di sicurezza alla tua azienda.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché