Estoy usando PostgreSQL 12 con EF6. Estoy tratando de agregar una vista materializada a mi modelo, pero la vista no aparece en el asistente de modelos. Sé que para poder agregar una vista a un modelo, Entity Framework necesita al menos una columna en la vista de la base de datos para que no sea anulable. Pero no estoy seguro de cómo hacerlo.

He intentado crear un índice único y también un número de fila sin éxito.

CREATE MATERIALIZED VIEW "Stock"
AS

SELECT coalesce(cast(ROW_NUMBER() OVER() as int), 0) as "Id",
    "PartMaster"."PartID",
    "OEMPart"."PartCatalogID",
    "PartMaster"."PartCode",
    "PartCatalog"."CustomPartCode",
    "OEMPart"."OEMCode",
    "PartMaster"."PartDesc",
    "GoodsReceivedDetail"."Cost",
    "GoodsReceivedDetail"."Markup",
    "GoodsReceivedDetail"."SellingPrice",
    coalesce("GoodsReceivedDetail"."Quantity", 0) as "InQuantity",
    coalesce("InvoiceDetail"."Quantity", 0) as "OutQuantity", 
    coalesce("GoodsReceivedDetail"."Quantity", 0) - coalesce("InvoiceDetail"."Quantity", 0) as "StockQuantity"
FROM
    "PartCatalog"
INNER JOIN
    "PartMaster"
ON
    (
        "PartCatalog"."PartID" = "PartMaster"."PartID")
INNER JOIN
    "OEMPart"
ON
    (
        "PartCatalog"."PartID" = "OEMPart"."PartID")
INNER JOIN
    "GoodsReceivedDetail"
ON
    (
        "OEMPart"."PartCatalogID" = "GoodsReceivedDetail"."PartCatalogID")
LEFT OUTER JOIN
    "InvoiceDetail"
ON
    (
        "GoodsReceivedDetail"."PartCatalogID" = "InvoiceDetail"."PartCatalogID")
INNER JOIN
    "PartCategory"
ON
    (
        "PartMaster"."PartCategoryID" = "PartCategory"."PartCategoryID") ;
        
CREATE UNIQUE INDEX "Id"
  ON "Stock" ("PartCatalogID");
0
Prashant 2 ago. 2020 a las 10:25

1 respuesta

La mejor respuesta

Para hacer visible este objeto, simplemente agregue una vista a su base de datos.

CREATE VIEW stock_view
AS select * from Stock

Nota: Las vistas materializadas se utilizan para aumentar el rendimiento de las consultas. Si no tiene problemas de rendimiento, limítese a las vistas regulares. Simplemente vuelva a escribir su vista materializada original como vista normal eliminando la palabra materialized.

Para responder a su pregunta original sobre cómo hacer que la columna Id de la tabla Stock no admita nulos, puede combinar las respuestas en esta publicación de Stack Overflow con este de la siguiente manera:

UPDATE pg_catalog.pg_attribute 
SET attnotnull = true
WHERE attrelid = Stock::regclass::oid
 and attname  = 'Id'
0
Lars Skaug 3 ago. 2020 a las 14:17