Är det överhuvudtaget möjligt att lägga till en vy till Entity-modellen utan en unik identifierare?
Om utan en primärnyckel, nej. Det kommer att leda till den här typen av fel:
Ett eller flera valideringsfel upptäcktes under modellgenerering:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' har ingen nyckel definierad. Definiera nyckeln för denna EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList är baserad på typen SalesOnEachCountry som har definierade nokeys.
Om utan en unik identifierare, ja, även om den har en icke önskvärd utdata. Poster med samma identifierare skulle referera till samma objekt, detta kallas Identity Map Pattern
Ett exempel, även om din vy producerar dessa två rader:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Om du bara kommer att mappa primärnyckeln på fältet Land, t.ex.
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; }
}
, även din vy producerar de två ovanstående raderna i din Oracle-frågeredigerare, Entity Framework producerar denna felaktiga utdata:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Framework kommer att anta att den andra raden är samma objekt som den första raden.
För att garantera unikhet måste du identifiera vilka kolumner som gör varje rad unik. I exemplet ovan måste Year inkluderas så att den primära nyckeln är 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; }
}
Genom att göra din primära nyckel lik attributen ovan, kan Entity Framework mappa varje vys rad till sina egna objekt. Därför kan Entity Framework nu visa exakt samma rader som din vy har.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Fullständig information här:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
Sedan när det gäller dina vyer som inte har några kolumner för att göra en rad unik, är det enklaste sättet att garantera att Entity Framework kan mappa varje vys rad till sina egna objekt att skapa en separat kolumn för din vys primära nyckel , en bra kandidat är att bara skapa en radnummerkolumn på varje rad. t.ex.
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
Tilldela sedan [Key]
attribut på RN-egenskapen för din class RowNumberedView