É possível adicionar uma visão ao modelo Entity sem um identificador exclusivo?
Se sem chave primária, não. Isso resultará nesse tipo de erro:
Um ou mais erros de validação foram detectados durante a geração do modelo:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' não tem chave definida. Defina a chave para este EntityType.System.Data.Edm.EdmEntitySet:EntityType:O EntitySetSalesOnEachCountryList é baseado no tipo SalesOnEachCountry que não tem nenhuma chave definida.
Se sem um identificador único, sim, embora tenha uma saída não desejável. Registros com o mesmo identificador fariam referência ao mesmo objeto, isso é chamado de Padrão de Mapa de Identidade
Um exemplo, mesmo que sua visualização produza essas duas linhas:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Se você apenas mapear a chave primária no campo País, por exemplo,
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; }
}
, mesmo que sua visualização produza as duas linhas acima em seu editor de consultas Oracle, o Entity Framework produz esta saída incorreta:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
O Entity Framework considerará que a segunda linha é o mesmo objeto que a primeira linha.
Para garantir a exclusividade, você deve identificar quais colunas tornam cada linha exclusiva. No exemplo acima, Year deve ser incluído para que a chave primária seja exclusiva. ou seja
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; }
}
Tornando sua chave primária semelhante aos atributos acima, o Entity Framework pode mapear corretamente a linha de cada exibição para seus próprios objetos. Portanto, o Entity Framework agora pode exibir exatamente as mesmas linhas que sua exibição.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Detalhes completos aqui:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
Então, em relação às suas visualizações que não têm colunas para tornar uma linha exclusiva, a maneira mais fácil de garantir que o Entity Framework possa mapear cada linha da sua visualização para seus próprios objetos é criar uma coluna separada para a chave primária
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
Em seguida, atribua a
[Key]
atributo na propriedade RN da sua class RowNumberedView