¿Es posible agregar una vista al modelo de Entidad sin un identificador único?
Si no tiene una clave principal, no. Eso resultará en este tipo de error:
Se detectaron uno o más errores de validación durante la generación del modelo:
System.Data.Edm.EdmEntityType::EntityType 'SalesOnEachCountry' no tiene clave definida. Defina la clave para este EntityType.System.Data.Edm.EdmEntitySet:EntityType:EntitySetSalesOnEachCountryList se basa en el tipo SalesOnEachCountry que no tiene claves definidas.
Si no tiene un identificador único, sí, aunque tiene una salida no deseada. Los registros con el mismo identificador harían referencia al mismo objeto, esto se denomina patrón de mapa de identidad
Un ejemplo, incluso si su vista produce estas dos filas:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Si solo asignará la clave principal solo en el campo País, p.
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; }
}
, incluso su vista produce las dos filas anteriores en su editor de consultas de Oracle, Entity Framework produce este resultado incorrecto:
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2010 20.000000
Entity Framework considerará que la segunda fila es el mismo objeto que la primera fila.
Para garantizar la unicidad, debe identificar qué columnas hacen que cada fila sea única. En el ejemplo anterior, se debe incluir el año para que la clave principal sea única. es decir,
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; }
}
Al hacer que su clave principal sea similar a los atributos anteriores, Entity Framework puede asignar correctamente la fila de cada vista a sus propios objetos. Por lo tanto, Entity Framework ahora puede mostrar exactamente las mismas filas que tiene su vista.
Country Year TotalSales
Philippines 2010 20.000000
Philippines 2011 40.000000
Detalles completos aquí:http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html
Luego, con respecto a sus vistas que no tienen columnas para hacer que una fila sea única, la forma más fácil de garantizar que Entity Framework pueda asignar cada una de las filas de su vista a sus propios objetos es crear una columna separada para la clave principal
create view RowNumberedView as
select
row_number() over(order by <columns of your view sorting>) as RN
, *
from your_existing_view
Luego asigne el [Key]
atributo en la propiedad RN de su class RowNumberedView