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

Utilizzo di una vista senza chiave primaria con Entity

È possibile aggiungere una vista al modello Entity senza un identificatore univoco?

Se senza chiave primaria, no. Ciò risulterà in questo tipo di errore:

Durante la generazione del modello sono stati rilevati uno o più errori di convalida:

System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' non ha una chiave definita. Definisci la chiave per questo EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList è basato sul tipo SalesOnEachCountry che non ha chiavi definite.

Se senza un identificatore univoco, sì, anche se ha un output non desiderabile. I record con lo stesso identificatore farebbero riferimento allo stesso oggetto, questo è chiamato Identity Map Pattern

Un esempio, anche se la tua vista produce queste due righe:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Se si mappa solo la chiave primaria solo sul campo Paese, ad es.

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

, anche la tua visualizzazione produce le due righe precedenti nell'editor di query Oracle, Entity Framework produce questo output errato:

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000

Entity Framework riterrà che la seconda riga sia lo stesso oggetto della prima riga.

Per garantire l'unicità, è necessario identificare quali colonne rendono unica ogni riga. Nell'esempio precedente, Year deve essere incluso in modo che la chiave primaria sia univoca. cioè

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

Rendendo la tua chiave primaria simile agli attributi sopra, Entity Framework può mappare correttamente ogni riga di visualizzazione ai propri oggetti. Pertanto, Entity Framework ora può visualizzare esattamente le stesse righe della tua vista.

Country     Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000

Tutti i dettagli qui:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

Quindi, per quanto riguarda le tue viste che non hanno colonne per rendere unica una riga, il modo più semplice per garantire che Entity Framework possa mappare ciascuna riga della tua vista ai propri oggetti è creare una colonna separata per la chiave primaria , un buon candidato è semplicemente creare una colonna del numero di riga su ogni riga. es.

create view RowNumberedView as

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

Quindi assegna il [Key] attributo sulla proprietà RN della tua class RowNumberedView