Hier ist, was ich kam mit:
Ich erstelle eine partielle Klasse, die erbt von DbContext
und fügen Sie dann jede neue Logik hinzu, indem Sie die OnModelCreating
Methode überschreiben.
Schließlich sollte der EF-Gerüstbauer (ich hoffe) in der Lage sein, Ansichten für mich zu erstellen, also rufe ich in der Zwischenzeit die Klasse MyStoreContext_WithViews
an, damit ich eine Suche durchführen und irgendwann ersetzen kann, um sie zu aktualisieren.
Die Datenbankansicht in diesem Beispiel heißt RepeatOrderSummaryView
.
Ich musste hier alle Spalten manuell zu meiner Ansichtsklasse hinzufügen (da der Gerüstbauer dies nicht unterstützt). Das ist im Moment in Ordnung.
Es gibt keinen Schlüssel in der Ansicht, aber EF benötigt einen Schlüssel, also erstelle ich nur einen falschen mit einer der Spalten.
namespace MyStore.EF.Model
{
public partial class MyStoreContext_WithViews : MyStoreContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<RepeatOrderSummaryView>(entity =>
{
entity.HasKey(e => new { e.FirstOrder_Date })
.HasName("PK_FAKEKEY");
});
}
public virtual DbSet<RepeatOrderSummaryView> RepeatOrderSummaryView { get; set; }
}
[Table("RepeatOrderSummaryView")]
public partial class RepeatOrderSummaryView
{
public DateTime OrderDate { get; set; }
public bool HasShipped { get; set; }
}
}
war ich dann in der Lage, diese Abfrage gegen die Ansicht erfolgreich auszuführen:
RRStoreContext_WithViews ctx = new RRStoreContext_WithViews();
var data = ctx.RepeatOrderSummaryView.Where(x => x.HasShipped == true);
Da diese Klasse von meinem generierten DbContext nur erbt (MyStoreContext
) ich natürlich den ganzen Rest der Tabellen verwenden können das waren gerüstet.
Nicht auf aktualisierbare Ansichten getestet - natürlich, wenn Sie dies versuchen, müssen Sie eine echte PK definiert.
Weil Sie nicht ‚echte‘ Einheiten oder notwendigerweise Elemente mit einem echten Schlüssel definiert Rückkehr sollten Sie .AsNoTracking()
verwenden. Ich habe weniger Ergebnisse in meiner Ergebnismenge gefunden, als ich erwartet hatte, und es war, weil es eine Schlüsselübereinstimmung machte und dachte, dass es das Objekt bereits im Speicher hatte.
Achten Sie darauf, sorgfältig zu testen, um sicherzustellen, dass die Anzahl der Ergebnisse wie erwartet ist - oder Sie werden große Probleme haben.
What difference does .AsNoTracking() make?