sql >> Databáze >  >> RDS >> Oracle

Použití pohledu bez primárního klíče s entitou

Je vůbec možné přidat pohled do modelu Entity bez jedinečného identifikátoru?

Pokud bez primárního klíče, ne. To bude mít za následek tento druh chyby:

Během generování modelu byla zjištěna jedna nebo více chyb ověření:

System.Data.Edm.EdmEntityType::EntityType „SalesOnEachCountry“ nemá definován žádný klíč. Definujte klíč pro tento EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList je založen na typu SalesOnEachCountry, který nemá definované žádné klíče.

Pokud bez jedinečného identifikátoru, ano, i když má nežádoucí výstup. Záznamy se stejným identifikátorem by odkazovaly na stejný objekt, tomu se říká Identity Map Pattern

Příklad, i když váš pohled vytváří tyto dva řádky:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Pokud budete pouze mapovat primární klíč pouze na pole Země, např.

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; }
}

, i když váš pohled vytváří v editoru dotazů Oracle dva výše uvedené řádky, Entity Framework vytváří tento nesprávný výstup:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000

Entity Framework bude mít za to, že druhý řádek je stejný objekt jako první řádek.

Aby byla zaručena jedinečnost, musíte určit, které sloupce činí každý řádek jedinečným. Ve výše uvedeném příkladu musí být zahrnut rok, takže primární klíč je jedinečný. tj.

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; }
}

Díky tomu, že váš primární klíč bude podobný výše uvedeným atributům, dokáže Entity Framework správně namapovat řádek každého zobrazení na jejich vlastní objekty. Entity Framework tedy nyní může zobrazovat přesně stejné řádky, jaké má vaše zobrazení.

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Kompletní podrobnosti zde:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

Pokud jde o vaše pohledy, které nemají žádné sloupce, aby byl řádek jedinečný, nejjednodušší způsob, jak zaručit, že Entity Framework dokáže namapovat každý řádek vašeho pohledu na jejich vlastní objekty, je vytvořit samostatný sloupec pro primární klíč , dobrým kandidátem je pouze vytvořit sloupec s číslem řádku na každém řádku. např.

create view RowNumberedView as

select 
    row_number() over(order by <columns of your view sorting>) as RN
    , *
from your_existing_view

Poté přiřaďte [Key] atribut ve vlastnosti RN vaší class RowNumberedView



  1. Jak vytvořit dotaz s group_concat na serveru SQL

  2. Jak formátovat datum v T-SQL

  3. Jak importovat CSV do MySQL Workbench

  4. Jak SIGN() funguje v MariaDB