sql >> Database >  >> RDS >> Oracle

Een weergave gebruiken zonder primaire sleutel met Entiteit

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 , is een goede kandidaat om op elke rij gewoon een rijnummerkolom te maken. bijv.

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



  1. Kolom bestaat niet?

  2. SQL Server SHOWPLAN_ALL

  3. Postgresql wijzig kolomtype van int in UUID

  4. Hoe u de laatste dag van de maand in T-SQL kunt krijgen