sql >> Base de Datos >  >> RDS >> Oracle

Usando una vista sin clave principal con Entidad

¿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 , un buen candidato es simplemente crear una columna de número de fila en cada fila. por ejemplo

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