sql >> Database teknologi >  >> RDS >> Oracle

Brug af en visning uden primær nøgle med Entity

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



  1. Sådan får du input fra brugeren under kørsel

  2. verify_queryable_inventory returneret ORA-20008:Timeout

  3. Oracle ODP.Net With Entity Framework 6 - Entity framework-databasekompatibel udbyder kunne ikke findes

  4. Hvad er forskellen mellem MySQL og SQL?