Er det overhovedet muligt at tilføje en visning til Entity-modellen uden en unik identifikator?
Hvis uden en primær nøgle, nej. Det vil resultere i denne type fejl:
En eller flere valideringsfejl blev opdaget under modelgenerering:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' har ingen nøgle defineret. Definer nøglen for denne EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList er baseret på typen SalesOnEachCountry, der har defineret nokeys.
Hvis uden en unik identifikator, ja, selvom den har et ikke-ønskeligt output. Poster med samme identifikator vil referere til det samme objekt, dette kaldes Identity Map Pattern
Et eksempel, selvom din visning producerer disse to rækker:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Hvis du kun vil kortlægge den primære nøgle i feltet Land, f.eks.
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; }
}
, selv din visning producerer de to ovenstående rækker på din Oracle-forespørgselseditor, Entity Framework producerer dette forkerte output:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Framework vil tage det, at den anden række er det samme objekt som den første række.
For at garantere unikhed skal du identificere hvilke kolonner, der gør hver række unik. I ovenstående eksempel skal år inkluderes, så den primære nøgle er unik. dvs.
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; }
}
Ved at få din primære nøgle til at ligne ovenstående attributter, kan Entity Framework kortlægge hver visnings række korrekt til deres egne objekter. Derfor kan Entity Framework nu vise nøjagtig de samme rækker, som din visning har.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Alle detaljer her:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
Med hensyn til dine visninger, som ikke har nogen kolonner for at gøre en række unik, er den nemmeste måde at sikre, at Entity Framework kan tilknytte hver af dine visningsrækker til deres egne objekter, ved at oprette en separat kolonne for din visnings primære nøgle , er en god kandidat bare at oprette en rækkenummerkolonne på hver række. f.eks.
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
Tildel derefter [Key]
attribut på RN-egenskaben for din class RowNumberedView