Wie kann ich die Datenbankansicht zuerst im Entity Framework-Code verwenden?
Wie kann ich die Datenbankansicht zuerst im Entity Framework-Code verwenden?
Antworten:
Wenn Sie wie ich nur daran interessiert sind, Entitäten aus einer anderen Datenbank (in meinem Fall ein ERP) zuzuordnen, um sie mit Entitäten zu verknüpfen, die für Ihre Anwendung spezifisch sind, können Sie die Ansichten verwenden, während Sie eine Tabelle verwenden (ordnen Sie die Ansicht in zu in der gleichen Weise!). Wenn Sie versuchen, diese Entitäten zu aktualisieren, erhalten Sie natürlich eine Ausnahme, wenn die Ansicht nicht aktualisierbar ist. Die Vorgehensweise ist dieselbe wie bei normalen (auf einer Tabelle basierenden) Entitäten:
Verwenden Sie eine FooViewConfiguration-Datei, um einen anderen Namen für die Ansicht festzulegen (mithilfe von ToTable ("Foo"); im Konstruktor) oder um bestimmte Eigenschaften festzulegen
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Fügen Sie die FooViewConfiguration-Datei zum modelBuilder hinzu, z. B. über die OnModelCreating-Methode des Kontexts:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
Dies ist wohl einfacher als das Erstellen von a EntityTypeConfiguration
.
Dies kann ein Update sein, aber um Ansichten mit EF-Code zu verwenden, fügen Sie einfach zuerst [Tabelle ("NameOfView")] an die Spitze der Klasse hinzu, und alles sollte einwandfrei funktionieren, ohne alle Rahmen durchlaufen zu müssen, die alle anderen durchlaufen. Außerdem müssen Sie eine der Spalten als [Schlüssel] -Spalte melden. Hier ist mein Beispielcode unten, um ihn zu implementieren.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SomeProject.Data
{
[Table("SomeView")]
public class SomeView
{
[Key]
public int NameID { get; set; }
public string Name { get; set; }
}
}
Und so sieht der Kontext aus
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Wenn Sie nur eine Reihe von nicht normalisierten Objekten benötigen, haben Sie möglicherweise nur eine öffentliche Nur-Get- IQueryable<TDenormolized>
Eigenschaft in Ihrer DbContext
Klasse erstellt.
In geben get
Sie ein Linq-Ergebnis zurück, um die de-normoalisierten Werte in Ihre de-normalisierten Objekte zu projizieren. Dies ist möglicherweise besser als das Schreiben einer DB-Ansicht, da Sie beim Programmieren nicht nur select
Anweisungen verwenden. Außerdem ist die Kompilierungszeit sicher.
Achten Sie nur darauf ToList()
, dass Sie keine Aufzählungen wie Aufrufe auslösen , da dies die verzögerte Abfrage unterbricht. Möglicherweise erhalten Sie eine Million Datensätze aus der Datenbank zurück und filtern sie auf Ihrem Anwendungsserver.
Ich weiß nicht, ob dies der richtige Weg ist, aber ich habe es versucht und es funktioniert für mich.
Ich weiß, dass dies eine alte Frage ist und es hier viele Antworten gibt, aber ich habe ein Problem erzwungen, als ich diese Antwort verwendet habe, und ein Fehler ist aufgetreten, als ich den Befehl update-database in der Package Manager-Konsole verwendet habe:
In der Datenbank befindet sich bereits ein Objekt mit dem Namen '...'.
und ich benutze diese Schritte, um dieses Problem zu lösen:
ich hoffe es hilft.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
. Damit Kollegen damit auch ihre Datenbank aktualisieren können.