Is het überhaupt mogelijk om een weergave aan het entiteitsmodel toe te voegen zonder een unieke identifier?
Indien zonder primaire sleutel, nee. Dat leidt tot dit soort fouten:
Er zijn een of meer validatiefouten gedetecteerd tijdens het genereren van het model:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' heeft geen sleutel gedefinieerd. Definieer de sleutel voor deze EntityType.System.Data.Edm.EdmEntitySet:EntityType:De EntitySetSalesOnEachCountryList is gebaseerd op het type SalesOnEachCountry waarvoor geen sleutels zijn gedefinieerd.
Als er geen unieke identificatiecode is, ja, hoewel het een niet-gewenste uitvoer heeft. Records met dezelfde identifier verwijzen naar hetzelfde object, dit wordt Identity Map Pattern genoemd
Een voorbeeld, zelfs als uw weergave deze twee rijen oplevert:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Als u alleen de primaire sleutel op het veld Land wilt toewijzen, b.v.
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; }
}
, zelfs uw weergave produceert de bovenstaande twee rijen in uw Oracle-query-editor, Entity Framework produceert deze onjuiste uitvoer:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Framework neemt aan dat de tweede rij hetzelfde object is als de eerste rij.
Om uniciteit te garanderen, moet u bepalen welke kolommen elke rij uniek maken. In het bovenstaande voorbeeld moet Jaar worden opgenomen, zodat de primaire sleutel uniek is. d.w.z.
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; }
}
Door uw primaire sleutel vergelijkbaar te maken met de kenmerken hierboven, kan Entity Framework de rij van uw weergaven correct toewijzen aan hun eigen objecten. Daarom kan Entity Framework nu exact dezelfde rijen weergeven als uw weergave.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Volledige details hier:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
Wat betreft uw weergaven die geen kolommen hebben om een rij uniek te maken, is de gemakkelijkste manier om te garanderen dat Entity Framework elke rij van uw weergave kan toewijzen aan hun eigen objecten, door een aparte kolom te maken voor de primaire sleutel
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
Wijs vervolgens de [Key]
. toe attribuut op RN-eigenschap van uw class RowNumberedView