Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Usando uma visualização sem chave primária com Entity


É 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 , um bom candidato é apenas criar uma coluna de número de linha em cada linha. por exemplo.
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