Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwenden einer Ansicht ohne Primärschlüssel mit Entität

Ist es überhaupt möglich, dem Entitätsmodell eine Ansicht ohne eindeutige Kennung hinzuzufügen?

Wenn ohne Primärschlüssel, nein. Das führt zu dieser Art von Fehler:

Während der Modellgenerierung wurden ein oder mehrere Validierungsfehler erkannt:

System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' hat keinen definierten Schlüssel. Definieren Sie den Schlüssel für dieses EntityType.System.Data.Edm.EdmEntitySet:EntityType:Die EntitySetSalesOnEachCountryList basiert auf dem Typ SalesOnEachCountry, für den keine Schlüssel definiert sind.

Wenn ohne eindeutige Kennung, ja, obwohl es eine unerwünschte Ausgabe hat. Datensätze mit demselben Bezeichner würden auf dasselbe Objekt verweisen, dies wird als Identity Map Pattern

bezeichnet

Ein Beispiel, auch wenn Ihre Ansicht diese beiden Zeilen erzeugt:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Wenn Sie den Primärschlüssel nur dem Feld Country zuordnen, z.

public class SalesOnEachCountry
{        
    [Key]
    public int CountryId { get; set; }
    public string CountryName { get; set; }        
    public int OrYear { get; set; }
    public long SalesCount { get; set; }
    public decimal TotalSales { get; set; }
}

, auch wenn Ihre Ansicht die beiden obigen Zeilen in Ihrem Oracle-Abfrage-Editor erzeugt, erzeugt Entity Framework diese falsche Ausgabe:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000

Entity Framework geht davon aus, dass die zweite Zeile dasselbe Objekt wie die erste Zeile ist.

Um die Eindeutigkeit zu gewährleisten, müssen Sie angeben, welche Spalten jede Zeile eindeutig machen. Im obigen Beispiel muss Jahr enthalten sein, damit der Primärschlüssel eindeutig ist. d.h.

public class SalesOnEachCountry
{        
    [Key, Column(Order=0)] public int CountryId { get; set; }
    public string CountryName { get; set; }
    [Key, Column(Order=1)] public int OrYear { get; set; }

    public long SalesCount { get; set; }      
    public decimal TotalSales { get; set; }
}

Wenn Sie Ihren Primärschlüssel den oben genannten Attributen ähneln, kann Entity Framework die Zeile jeder Ansicht korrekt ihren eigenen Objekten zuordnen. Daher kann Entity Framework jetzt genau die gleichen Zeilen anzeigen, die Ihre Ansicht hat.

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Vollständige Details hier:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

In Bezug auf Ihre Ansichten, die keine Spalten haben, um eine Zeile eindeutig zu machen, besteht die einfachste Möglichkeit, sicherzustellen, dass Entity Framework jede Zeile Ihrer Ansicht ihren eigenen Objekten zuordnen kann, darin, eine separate Spalte für den Primärschlüssel , ist es ein guter Kandidat, einfach eine Zeilennummernspalte für jede Zeile zu erstellen. z. B.

create view RowNumberedView as

select 
    row_number() over(order by <columns of your view sorting>) as RN
    , *
from your_existing_view

Weisen Sie dann den [Key] zu -Attribut auf der RN-Eigenschaft Ihrer class RowNumberedView