2017-07-16 2 views

Antwort

4

Derzeit (der neueste offizielle EF Core v1.1.2) gibt es keine öffentliche Alternative. Es gibt Pläne, freizulegen, aber laut EF Core Roadmap sind sie verschoben und werden in der kommenden Version 2.0 nicht verfügbar sein.

Zum Glück EF-Core setzt alle internen Infrastruktur Klassen/Interfaces, so konnte ich die folgende Problemumgehung unter der typischen EF Kerneinbauten Nutzungs Haftungsausschluss

Diese API unterstützt die Entity Framework Core-Infrastruktur legen nahe, und ist nicht dazu gedacht, direkt aus deinem Code verwendet werden. Diese API wird möglicherweise in zukünftigen Versionen geändert oder entfernt.

Was habe ich im Sinn der Microsoft.EntityFrameworkCore.ChangeTracking.Internal Namespace wird verwendet, und insbesondere die ILocalViewListener-Schnittstelle, die die folgende Methode

void RegisterView(Action<InternalEntityEntry, EntityState> viewAction) 

Die viewAction können Sie delegieren registrieren bereitstellt, die auf jedem Entitätsstatus aufgerufen wird Änderung, einschließlich Anfügen, Hinzufügen, Löschen, Entfernen etc.

So in Ihrem DbContext abgeleiteten Klassenkonstruktor, könnten Sie erhalten ILocalViewListener Service und wieder gister die Handler wie folgt aus:

using Microsoft.EntityFrameworkCore; 
using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; 
using Microsoft.EntityFrameworkCore.Infrastructure; 

public class MyDbContext : DbContext 
{ 
    // ... 
    public MyDbContext() 
    { 
     this.GetService<ILocalViewListener>()?.RegisterView(OnStateManagerChanged); 
    } 

    void OnStateManagerChanged(InternalEntityEntry entry, EntityState previousState) 
    { 
     if (previousState == EntityState.Detached && entry.EntityState == EntityState.Unchanged) 
     { 
      // Process loaded entity 
      var entity = entry.Entity; 
     } 
    } 
} 

im Handler, können Sie auch die InternalEntityEntry.ToEntityEntry() Methode verwenden, um das regelmäßige EntityEntry Objekt (ähnlich DbContext.Entry und ChangeTracker.Entries Methoden) zu erhalten, wenn Sie es vorziehen, mit ihm arbeiten, anstatt der internen InternalEntityEntry Klasse .

Getestet und funktioniert in EF Core v1.1.2.

+0

Große Antwort. Funktioniert wie ein Chef. Kleine Korrektur entry.ToEntityEntry(). Entity gibt Ihnen die reguläre Entität. Ich hätte dir das Kopfgeld schon gegeben, aber SO sagt ich muss 12 Stunden warten. – Murdock

+0

Gern geschehen, froh, dass es geholfen hat :) Was mit 'ToEntityEntry' gemeint ist, wollte ich das" normale "' EntityEntry'-Objekt zum Arbeiten bringen (und nicht den 'InternalEntityEntry'). Aber 'InternalEntityEntry' hat die Eigenschaft 'Entity', die auch die reguläre Entität liefert, also ist' ToEntityEntry' wirklich beliebig. –

+0

In der Tat :). Ich wollte nur diesen Eintrag hinzufügen. ToEntityEntry(). Entity gibt Ihnen die tatsächliche Entität aus Ihrer Domäne. – Murdock

Verwandte Themen