acabo de empezar en un proyecto de conversión de una aplicación de ADO.NET y SQL incrustado en bruto a la Entidad. Me encontré con un problema con una de las vistas utilizadas por la aplicación. La vista no tiene clave principal ni columna (o combinación de columnas) que identifique una fila de manera única. Aquí está el seleccionar la vista se crea con:Usando una vista con ninguna clave primaria con Entidad
SELECT
filingmonth,
CEIL(filingmonth/3),
licnum,
filingyear,
DECODE(GROUPING(insurername), '1', '- All Insured -', insurername),
insurername,
policylinecode,
linedescription,
SUM(NVL(grosspremium, 0)),
SUM(DECODE(taxexempt, 1, grosspremium, 0)),
TRUNC(
CASE
WHEN
(
b.rsn IS NOT NULL
OR A.zeroreport = 1
)
AND b.datereceived IS NULL
THEN A.datereceived
ELSE b.datereceived
END),
SUM(aip.iscompanyadmitted(b.naiccocode, b.naicalienid)),
A.insuredid
FROM
aip.slbtransinsured A
LEFT OUTER JOIN aip.slbtransinsurer b
ON
A.insuredid = b.insuredid
LEFT OUTER JOIN aip.slblinecodes C
ON
b.policylinecode = C.linecode
WHERE
A.submitted = 1
AND A.entryincomplete = 0
GROUP BY
licnum,
filingmonth,
filingyear,
TRUNC(
CASE
WHEN
(
b.rsn IS NOT NULL
OR A.zeroreport = 1
)
AND b.datereceived IS NULL
THEN A.datereceived
ELSE b.datereceived
END),
ROLLUP(insurername, aip.iscompanyadmitted(b.naiccocode, b.naicalienid),
policylinecode, linedescription), A.insuredid;
Y aquí es algunos datos de ejemplo que muestran que hay algunas filas que están completamente duplicada (filas 3 y 4):
FILINGMONTH CEIL(FILINGMONTH/3) LICNUM FILINGYEAR DECODE(GROUPING(INSURERNAME),'1','-ALLINSURED-',INSURERNAME) INSURERNAME POLICYLINECODE LINEDESCRIPTION SUM(NVL(GROSSPREMIUM,0)) SUM(DECODE(TAXEXEMPT,1,GROSSPREMIUM,0)) TRUNC(CASEWHEN(B.RSNISNOTNULLORA.ZEROREPORT=1)ANDB.DATERECEIVEDISNULLTHENA.DATERECEIVEDELSEB.DATERECEIVEDEND) SUM(AIP.ISCOMPANYADMITTED(B.NAICCOCODE,B.NAICALIENID)) INSUREDID
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 17 OTHER LIABILITY 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 17 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 721.25 0 18-JUL-07 0 81
insuredid es la pk para la tabla aip.slbtransinsured, RSN es el pk para aip.slbtransinsurer y aip.slblinecodes.
¿Es del todo posible agregar la vista el modelo Entidad sin un identificador único? ¿O hay una manera fácil de agregar un identificador de fila único a la vista? La vista solo se lee, nunca se escribe.
Gracias por esto, realmente me ayudaste. Estoy trabajando con tablas de Oracle que no tienen una columna de ID única visible y estaba empezando a desesperar porque LINQ estaba devolviendo la misma fila. Seguí tu sugerencia acerca de crear mi propia clave en la clase Entity y funciona perfectamente. – markp3rry
Creo que agregar un guid a la proyección es más eficiente. En las vistas con campos de datos binarios, he encontrado que (orden por) ralentiza la consulta. ¿Hay algún problema con este enfoque?Por ejemplo: SELECT NEWID() AS PrimaryKey, FROM View –
Sin embargo, hay una manera de obtener una vista agregada como una "entidad de solo lectura" sin clave primaria si usa Database-first Entity Framework. Incluso obtiene [un error claro] (http://stackoverflow.com/questions/24792259/error-6002-the-table-view-does-not-have-a-primary-key-defined) cuando agrega una vista sin una clave obvia que indique que EF está ** obligando ** a su entidad a ser una entidad sin llave de solo lectura. Seguramente hay una manera de duplicar esto usted mismo? – ruffin