Entity Framework und SQL Server-Ansicht

.net-3.5 entity-framework primary-key sql-server-2005 sql-view

Frage

Aus verschiedenen Gründen, über die ich nicht sprechen darf, definieren wir eine Ansicht in unserer SQL Server 2005-Datenbank wie folgt:

CREATE VIEW [dbo].[MeterProvingStatisticsPoint]
AS
SELECT
    CAST(0 AS BIGINT) AS 'RowNumber',
    CAST(0 AS BIGINT) AS 'ProverTicketId',
    CAST(0 AS INT) AS 'ReportNumber',
    GETDATE() AS 'CompletedDateTime',
    CAST(1.1 AS float) AS 'MeterFactor',
    CAST(1.1 AS float) AS 'Density',
    CAST(1.1 AS float) AS 'FlowRate',
    CAST(1.1 AS float) AS 'Average',
    CAST(1.1 AS float) AS 'StandardDeviation',
    CAST(1.1 AS float) AS 'MeanPlus2XStandardDeviation',
    CAST(1.1 AS float) AS 'MeanMinus2XStandardDeviation'
WHERE 0 = 1

Die Idee ist, dass das Entity Framework eine Entität erstellt, die auf dieser Abfrage basiert. Dies wird jedoch mit einem Fehler generiert, der Folgendes angibt:

Warnung 6002: In der Tabelle / Sicht 'Keystone_Local.dbo.MeterProvingStatisticsPoint' ist kein Primärschlüssel definiert. Der Schlüssel wurde abgeleitet und die Definition wurde als schreibgeschützte Tabelle / Sicht erstellt.

Und es entscheidet, dass das CompletedDateTime-Feld dieser Primärschlüssel der Entität ist.

Wir verwenden EdmGen, um das Modell zu generieren. Gibt es eine Möglichkeit, dass das Entitätsframework kein Feld dieser Ansicht als Primärschlüssel enthält?

Akzeptierte Antwort

Wir hatten das gleiche Problem und dies ist die Lösung:

Verwenden Sie ISNULL, um das Entity-Framework zur Verwendung einer Spalte als Primärschlüssel zu zwingen.

Verwenden Sie NULLIF, um das Entity-Framework zu zwingen, eine Spalte nicht als Primärschlüssel zu verwenden.

Dies können Sie ganz einfach anwenden, indem Sie die select-Anweisung Ihrer Ansicht in eine andere select-Datei einschließen.

Beispiel:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

Beliebte Antwort

Ich konnte dieses Problem mit dem Designer beheben.

  1. Öffnen Sie den Modellbrowser.
  2. Finden Sie die Ansicht im Diagramm.
  3. Klicken Sie mit der rechten Maustaste auf den Primärschlüssel, und stellen Sie sicher, dass "Entity Key" aktiviert ist.
  4. Wählen Sie alle nicht primären Schlüssel aus. Verwenden Sie die Strg- oder Umschalttaste.
  5. Ändern Sie im Eigenschaftenfenster (drücken Sie ggf. F4, um es anzuzeigen) die Dropdown-Liste "Entity Key" in "False".
  6. Änderungen speichern.
  7. Schließen Sie Visual Studio und öffnen Sie es erneut. Ich verwende Visual Studio 2013 mit EF 6 und musste dies tun, um die Warnungen zu erhalten, die entfernt werden sollten.

Ich musste meine Ansicht nicht ändern, um die Problemumgehungen ISNULL, NULLIF oder COALESCE zu verwenden. Wenn Sie Ihr Modell von der Datenbank aus aktualisieren, werden die Warnungen erneut angezeigt, verschwinden jedoch, wenn Sie VS schließen und erneut öffnen. Die im Designer vorgenommenen Änderungen bleiben erhalten und werden von der Aktualisierung nicht beeinflusst.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum