2017-11-04 3 views
0

Ich möchte eine universelle Datenzugriffsschicht durch ein Business-Logik-Projekt erstellen, muss die Business-Logik-Ebene mit der DAL-Schicht interagieren, in der ich ein Repository haben. Ich möchte einen kurzlebigen Datenkontext und alle Repository-Methoden, die IEnumerable und nicht IQueryable zurückgeben. Fragen Sie nach einem Beispiel der Methode GetAll, wie ich die verbundenen Daten durch ThenInclude oder Select zu abhängigen Tabellen extrahieren kann.Entity Framework Core, generische Repository-Methode mit Einschluss Navigationseigenschaften

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class 
{ 
    public virtual IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties) 
    { 

     List<T> list; 
     using (var context = new Context()) 
     { 
      IQueryable<T> dbQuery = context.Set<T>(); 

      //Apply eager loading 
      foreach (Expression<Func<T, object>> navigationProperty in navigationProperties) 
       dbQuery = dbQuery.Include<T, object>(navigationProperty); 

      list = dbQuery 
       .AsNoTracking() 
       .ToList<T>(); 
     } 
     return list; 
    } 

}

ThenInclude (prop2 => prop2.i)?

dbQuery.Include (Navigation) .ThenInclude (prop2 => prop2.i)

Antwort

0

Dies ist eigentlich schlechtes Design. Du willst das nicht tun. Wenn Sie Ihre Datenzugriffsebene abstrahieren möchten, tun Sie dies vollständig. Erstellen Sie eine Bibliothek, die eine API für Ihre Anwendung bereitstellt, die genau das zurückgibt, was Sie brauchen, nicht mehr und nicht weniger. Wenn Sie weiterhin willkürliche Abfragen zulassen möchten, verwenden Sie einfach Ihren Kontext, da Sie sich eigentlich nichts anderes als eine zusätzliche zu erhaltende Schicht kaufen, ohne wirklichen Nutzen.

+0

Vielen Dank. Ich wollte eine API für den Zugriff auf Daten erstellen, es verwendet eine Schicht von Geschäftslogik. In der Zukunft ist es möglich, die EF durch einen Dapper zu ersetzen, wobei die EF nur für Migrationen übrig bleibt. Ich verstehe, dass Sie die Arbeit mit IGureble in der Schicht, der Geschäftslogik, empfehlen? Von der Datenzugriffsebene abstrahiert möchte ich eine Schicht von Geschäftslogik. Geschäftslogik-> Repository-> EF-> Db – Aldmi

+0

Die Sache ist, dass Switch-Adapter wie diese wird wahrscheinlich Auswirkungen darauf, wie Abfragen sowieso konstruiert werden müssen. Wenn das wirklich Ihr Ziel ist, dann möchten Sie, dass Ihre App auf Methoden wie 'layer.GetSomeSpecificThing()', nicht 'layer.Get (someQuery, includeSomeStuff, moreLogic)' angewiesen ist. Das wird unendlich viel wartbarer und anpassungsfähiger. –

+0

Ja, Sie haben Recht, Geschäftslogik wird viele spezifische Methoden beinhalten und die Arbeit mit Repositories in einer bestimmten Methode kombinieren. Und wie empfehlen Sie, einen Zugriff auf Daten über die EF zu schaffen? – Aldmi

Verwandte Themen