2016-03-21 8 views
2

Ich arbeite an einer neuen Webanwendung mit ASP.Net 5/EF7.Repository-Muster mit EF7

Ich denke auch über das Repository-Muster zusammen mit Entity Framework.

Ich bin auf der Suche nach einem Rat, um mit meiner generischen Repository-Klasse umzugehen. Da EF7 noch keine Find() - Methode hat, habe ich Schwierigkeiten, die Methode wie GetById (int id) in meiner generischen Repository-Klasse zu implementieren. Ich weiß, dass FirstOrDefault() stattdessen verwendet werden kann, aber ich habe keinen Zugriff auf die tatsächliche ID aus dem Modell.

Können Sie mir bitte helfen, eine Alternative zu finden?

Unten ist mein generische Repository-Klasse:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected readonly PersonDBContext _dbContext; 

    public Repository(PersonDBContext context) 
    { 
     _dbContext = context; 
    } 

    public IEnumerable<TEntity> GetAll() 
    { 
     return _dbContext.Set<TEntity>().ToList(); 
    } 

    public TEntity Get(int? id) 
    { 
     return _dbContext.Set<TEntity>().FirstOrDefault(); 
    } 

    public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) 
    { 
     return _dbContext.Set<TEntity>().Where(predicate); 
    } 

    public void Add(TEntity entity) 
    { 
     _dbContext.Set<TEntity>().Add(entity); 
    } 

    public void Remove(TEntity entity) 
    { 
     _dbContext.Set<TEntity>().Remove(entity); 
    } 
} 

Dank Saeed

+0

Gibt es eine gemeinsame Eigenschaft/Feld auf "TEntity", die referenziert werden kann. Kannst du zeigen, wie 'TEntity' aussieht? – Nkosi

+0

TEntity wird später ein Modell sein, wenn ich es an die Repository-Klasse übergebe. Dies ist die generische Repository-Klasse. In diesem Fall wird die TEntity das Modell sein, das z.B. Person. – Xerxes1TheGreat

Antwort

1

Hier ist etwas, das Sie versuchen können.

Basierend auf Ihrem Kommentar, dass Sie nicht die tatsächliche ID des Modells kennen, dann verwenden Sie einen Ausdruck wie Sie mit der Find, um die Entität zu bekommen, die Sie suchen.

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class { 
    //..... 

    public TEntity Get(Expression<Func<TEntity, bool>> predicate) 
    { 
     return _dbContext.Set<TEntity>().FirstOrDefault(predicate); 
    } 

    //..... 
} 
+0

Das ist ein guter Ansatz, Danke. Aber denken Sie, dass dies die effiziente Methode ist, da ich viele Modelle (Code First aus der Datenbank) haben werde und alle von dieser Schnittstelle abgeleitet werden müssen? – Xerxes1TheGreat

+0

In diesem Fall könnten Sie den Ausdruck Route verwenden und das erste Ergebnis nehmen. Ich werde die Antwort bearbeiten, um das zu reflektieren. – Nkosi

+0

Vielen Dank für Ihren Rat. Ja, richtig, ich habe diese Technik für Find() verwendet, da es in EF7 keinen Fund gibt, und ich habe nicht erkannt, dass ich dieselbe Methodenimplementierung auch für GetById() verwenden könnte. Vielen Dank für Ihre Hilfe. – Xerxes1TheGreat

1

Ich habe einen Beitrag in meinem Blog erstellt, die erläutert, wie eine generische Repository erstellen, können Sie es überprüfen bei Generic Repository using EntityFramework

Sie werden einen anderen Parameter Ihre generische Schnittstelle hinzufügen müssen, anstatt nur mit der Entitätstyp, können Sie auch den Primärschlüssel Typ übergeben und Sie können auch eine Basisklasse verwenden

+0

Danke mein Freund, deine Idee ist auch clever. Ich habe es mir angesehen und ein paar Notizen gemacht. Vielen Dank. – Xerxes1TheGreat

Verwandte Themen