È 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
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