2016-11-10 6 views
0

Ich bin auf der Suche nach einer Möglichkeit, Datenbankabfragen abzufangen, um detailliertere Leistungsstatistiken zu erhalten. Ich bin nach Anzahl der Abfragen, Abfragedauer, den Ergebnisdaten (für eine Idee der Datengröße) und idealerweise einigen Zugriffen auf jeden LINQ-Ausdruck.Datenbankzugriffe mit EF Core abfangen

Ich kann auf die Erweiterung einer Basiskontextklasse zurückgreifen und eine andere Methode erstellen, um DbSet zu erhalten, einen Wrapper dorthin zurückzubringen, aber 1) das scheint hackier, als es sein sollte, 2) kein Code wird es nicht können unterscheiden zwischengespeicherten Ergebnisse bekommen vs tatsächliche Datenbank zugreift ..

ich durch den Code geschaut haben und fühlen sich wie Einwickeln ExecutionStrategyFactory oder Database ist der Weg zu gehen - und während ich eine Erweiterungsmethode auf RelationalDbContextOptionsBuilder für das ehemalige erstellen können, oder/replace/services, ich kann auch keine Möglichkeit zum Wrapping sehen, so dass die Implementierung des zugrunde liegenden Providers immer noch verwendet wird.

(Siehe auch: https://github.com/aspnet/EntityFramework/issues/6967)

Gibt es ein ordentliches Hotel in diese Haken?

Antwort

1

Für die ref von jemand anderem:

Ok, ist der Trick:

  1. die IRelationalConnection ersetzen, dass EF Core DI-System über ReplaceService<IRelationalConnection, MyRc>() verwendet. Unsere neue MyRc wird die vorhandene Verbindung zum Hinzufügen von Hooks umhüllen
  2. In unserem MyRc, haben Sie einen Konstruktor param IDatabaseProviderServices. Das EF DI-System füllt es auf. Cast, das zu IRelationalDatabaseProviderServices und dann greifen die RelationalConnection Eigenschaft von diesem
  3. Wrap alle Methoden, haben aber öffentliche DbConnection DbConnection { get; } Rückkehr eine Instanz einer DbConnection -UMMANTELUNG Klasse
  4. In dass Wickel Klasse haben CreateDbCommand() Rückkehr eine Instanz eines DbCommand -UMMANTELUNG Klasse
  5. In dass Wickel Klasse, haben ExecuteDbDataReader() Rückkehr eine Instanz einer DbDataReader -UMMANTELUNG Klasse

Dann können wir in den Wrappern DbCommand und DbDataReader sehen, welche Befehle und Parameter an die Datenbank gesendet werden und welche Ergebnisse zurückkommen.

Dies funktioniert nur mit relationalen Modellen.

+0

Und wie machen Sie das für EFCore 2.0? Ich habe ein Problem mit den IDatabaseProviderServices. Mein Visual Studio kann es nicht finden, und ich glaube sogar, dass es nicht mehr da ist. –