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
bezeichnetEin 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
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