Heim > Backend-Entwicklung > C#.Net-Tutorial > Tutorial zur Implementierung des benutzerdefinierten Paging-Effekts von Entity Framework

Tutorial zur Implementierung des benutzerdefinierten Paging-Effekts von Entity Framework

巴扎黑
Freigeben: 2017-08-12 16:39:23
Original
2329 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die allgemeine Implementierung von benutzerdefinierten Paging-Effekten, Ergänzungen, Löschungen und Änderungen basierend auf Entity Framework vor. Interessierte Freunde können darauf verweisen

Einführung

Ich habe zuvor eine Paging-Implementierung basierend auf Dapper geschrieben, und jetzt werde ich eine Paging-Implementierung basierend auf Entity Framework sowie eine universelle Implementierung von Hinzufügungen, Löschungen und Änderungen schreiben.

Code

Beginnen wir mit dem Code: https://github.com/jinweijie/EF.GenericRepository

So führen Sie das Beispiel aus

wie zuvor:

1. Klonen Sie zuerst den Code und dekomprimieren Sie Database.7z in Database

2 SQL Server LocalDB. Wenn Sie LocalDB von SQL Server nicht verwenden, müssen Sie die Verbindungszeichenfolge in App.Config ändern.

3. Strg + F5, führen Sie das Beispielprogramm aus.

Repository-Basisklasse – Abfrage

CommonAbstractRepository.cs ist die Basisklasse von Repository, die das Hinzufügen und Löschen implementiert , Änderung und Abfrage. Einige Methoden, wie zum Beispiel:


public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria
      , int pageIndex
      , int pageSize
      , string[] asc
      , string[] desc
      , params Expression<Func<T, object>>[] includeProperties)
Nach dem Login kopieren

Diese Methode ist eine der AbstractRepository-Abfragemethoden und wird zum Anpassen von Paging-Abfragen verwendet, wobei Kriterien ein sind Ausdruck als Abfragebedingungen, Parameter pageIndex, pageSize, asc, desc sind pagingbezogene Parameter;

In Bezug auf mehrere Tabellen (zugeordnete Tabellen):

includeProperties ist die mit Join verknüpfte Tabelle, wenn mehrere vorhanden sind Tische. Da EF standardmäßig Lazy Loading verwendet, werden die zugehörigen Tabellen standardmäßig nicht sofort geladen. Wenn Sie also beim Schreiben von Code nicht vorsichtig sind, kann es vorkommen, dass Sie in einer for-Schleife n-Wort-Tabellen durchlaufen. Verwenden Sie den Parameter „includeProperties“, um die zugehörige Tabelle während der Abfrage zu verknüpfen.

Repository-Basisklasse – Hinzufügen, Löschen und Ändern

AbstractRepository hat die Methoden zum Hinzufügen, Löschen und Ändern mithilfe von Generika implementiert:

public virtuelles T erstellen(T-Entität)
öffentliches virtuelles T-Update(T-Entität)
öffentliches virtuelles T erstellenOrUpdate(T-Entität)
öffentliches virtuelles Leere löschen(TId-ID)

In Darüber hinaus habe ich zur Implementierung der Transaktion den Unit of Work-Modus verwendet. Mehrere Repositorys teilen sich einen DBContext. Informationen zu UOW finden Sie in CommonUnitOfWork.cs.

Beim Aufruf von UOW ist es im Grunde ähnlich wie folgt:


var uow = new EFUnitOfWork();
var repo = uow.GetLogRepository();

repo.Create(new Log
{
  LevelId = 1,
  Thread = "",
  Location = "Manual Creation",
  Message = "This is manually created log.",
  CreateTime = DateTimeOffset.Now,
  Date = DateTime.Now
});

uow.Commit();
Nach dem Login kopieren

Rufen Sie ein oder mehrere Repositorys von UnitOfWork ab, geben Sie DBContext frei und fügen Sie es hinzu und löschen Sie es , und Änderungsvorgang, und schließlich vereinheitlicht uow SaveChanges.

Abgeleitete Klassen von Repository

Da es bereits AbstractRepository gibt, sind viele Methoden zum Hinzufügen, Löschen, Ändern und Überprüfen implementiert, sodass abgeleitete Klassen, wie z LogRepository im Beispielprojekt Es kann grundsätzlich sehr einfach werden, hauptsächlich durch die Implementierung einer bestimmten Geschäftslogik. Da es im Beispielprojekt keine spezielle Geschäftslogik gibt, wird es sehr einfach sein:


public class LogRepository : AbstractRepository<Log, int>
  {
    public LogRepository(EFContext context)
      : base(context)
    {
    }
  }
Nach dem Login kopieren

Über die Entitätsgenerierung

Ich bevorzuge die Datenbank-First-Implementierung. Ich entwerfe zuerst die Datenbank und verwende dann edmx Reverse Engineering, um POCO zu generieren. Sie können auf die relevanten Dateien im Entity-Verzeichnis verweisen.

Wenn Ihnen Code First gefällt, ist das natürlich kein Problem und die Umsetzung dieses Artikels gilt weiterhin.

Verwenden Sie die Protokollierung, um EF SQL zu verfolgen

Bei der Verwendung von Entity Framework ist es am besten, auf das von EF generierte SQL zu achten, damit dies möglich ist Während der Entwicklungsphase entdeckt Einige potenzielle Leistungsprobleme können eine Überlastung in der Produktionsumgebung vermeiden:)

In CommonEFContext.cs gibt es ein Konfigurationselement EnableTraceSql. Wenn es wahr ist, wird die von EF generierte SQL aufgezeichnet von nlog. Ich habe NLOG-Protokolle für die Datenbank konfiguriert. Das heißt, wenn Sie das Beispielprojekt ausführen, wird bei jeder Abfrage ein neuer Protokolldatensatz hinzugefügt, und der Inhalt ist die während der Abfrage generierte SQL:

Spezifikationsmuster

In der Abfragemethode gibt es eine Überladung, die ein ISpecification-Beispiel akzeptiert. Diese Implementierung kann die Geschäftslogik effektiv steuern, damit sie von anderen aufgerufen werden kann. Sie können die Abfrageparameter eindeutig bestimmen, zum Beispiel:


public class LogSearchSpecification : ISpecification<Log>
  {
    public string LevelName { get; set; }
    public string Message { get; set; }
    public Expression<Func<Log, bool>> ToExpression()
    {
      return log => (log.Level.Name == LevelName || LevelName == "") &&
             (log.Message.Contains(Message) || Message == "");
    }

    public bool IsSatisfiedBy(Log entity)
    {
      return (entity.Level.Name == LevelName || LevelName == "") &&
          (entity.Message.Contains(Message) || Message == "");
    }
  }
Nach dem Login kopieren

Dann kann der Code, der diese Abfragemethode aufruft, eindeutig erkennen, dass meine Abfragebedingungen LevelName und Message sind. LevelName Is equal to und Message is Like werden in LogSearchSpeficiation implementiert, wodurch eine gute Kapselung erreicht wird.

Das obige ist der detaillierte Inhalt vonTutorial zur Implementierung des benutzerdefinierten Paging-Effekts von Entity Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage