it-swarm.com.de

so verwenden Sie Ansichten im Code First Entity Framework

Wie kann ich die Datenbankansicht zuerst in Entity Framework Code verwenden,

71
Sagar

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 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 Prozedur ist dieselbe wie bei normalen Entitäten (basierend auf einer Tabelle):

  1. Erstellen Sie eine POCO-Klasse für die Ansicht. zum Beispiel FooView
  2. Fügen Sie die DbSet-Eigenschaft in der DbContext-Klasse hinzu
  3. 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");
        }
    }
    
  4. Fügen Sie die FooViewConfiguration-Datei zum modelBuilder hinzu, beispielsweise um die OnModelCreating-Methode des Context zu übersehen:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    
77

Dies kann ein Update sein. Um jedoch Ansichten mit EF-Code verwenden zu können, fügen Sie zunächst [Table ("NameOfView")] ganz oben in der Klasse hinzu. Alle sollten funktionieren, ohne dass Sie alle Rahmen durchlaufen müssen, die alle anderen durchlaufen. Außerdem müssen Sie eine der Spalten als [Schlüssel] -Spalte angeben. Hier ist mein Beispielcode, 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; }
    }
}
12
Al Katawazi

Wenn Sie nur eine Reihe von nicht normalisierten Objekten wünschen, haben Sie möglicherweise nur eine öffentliche IQueryable<TDenormolized>-Eigenschaft in Ihrer DbContext-Klasse erstellt. 

In get geben Sie ein Linq-Ergebnis zurück, um die deaktivierten Werte in Ihre nicht normalisierten Objekte zu projizieren. Dies ist möglicherweise besser als das Schreiben einer DB-Ansicht, da Sie programmieren. Sie sind nicht darauf beschränkt, nur select-Anweisungen zu verwenden. Es ist auch die Art der Kompilierzeit sicher. 

Seien Sie vorsichtig, lösen Sie keine Aufzählungen wie ToList()-Aufrufe aus, die die verzögerte Abfrage unterbrechen, und Sie erhalten möglicherweise eine Million Datensätze aus der Datenbank und filtern diese auf Ihrem Anwendungsserver. 

Ich weiß nicht, ob das der richtige Weg ist, aber ich habe es versucht und es funktioniert für mich.

9
oldhouseye

Ich weiß, dass dies eine alte Frage ist, und es gibt viele Antworten, aber ich habe ein Problem erzwungen, wenn ich this answer verwende, und ein Fehler ist aufgetreten, wenn ich den Befehl update-database in Package Manager Console verwende:

Es gibt bereits ein Objekt mit dem Namen '...' in der Datenbank.

und ich benutze diese Schritte, um dieses Problem zu lösen:

  1. führen Sie diesen Befehl in Package Manager Console aus: Add-migration intial
  2. Unter dem Ordner "Migrations" finden Sie die Datei ..._ intial.cs, öffnen Sie sie und kommentieren Sie sie, oder löschen Sie alle Befehle, die sich auf Ihre Klasse beziehen, die Sie zuordnen möchten
  3. jetzt können Sie normalerweise den Befehl update-database für andere Änderungen an Ihren Modellen verwenden

ich hoffe es hilft.

0
Sepehr Estaki