sql >> Databasteknik >  >> RDS >> Oracle

Använda en vy utan primärnyckel med Entity

Ä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



  1. Oracle JDBC ojdbc6 Jar som ett Maven-beroende

  2. Hur man inkluderar exkluderade rader i ÅTERKOMMANDE från INFOGA ... VID KONFLIKT

  3. Oracle-inställning per användarens standardschema (inte ändra en session)

  4. Tips för att fixa SQL Server Index Fragmentation