Entity Framework et vue SQL Server

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

Question

Pour plusieurs raisons que je n'ai pas la liberté de parler, nous définissons une vue sur notre base de données SQL Server 2005 comme suit:

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

L'idée est que Entity Framework créera une entité sur la base de cette requête, ce qu'il fait, mais il la génère avec une erreur qui indique ce qui suit:

Avertissement 6002: aucune clé primaire n'a été définie dans la table / vue 'Keystone_Local.dbo.MeterProvingStatisticsPoint'. La clé a été déduite et la définition a été créée sous forme de table / vue en lecture seule.

Et il décide que le champ CompletedDateTime sera la clé primaire de cette entité.

Nous utilisons EdmGen pour générer le modèle. Existe-t-il un moyen de ne pas laisser le cadre d'entité inclure un champ de cette vue en tant que clé primaire?

Réponse acceptée

Nous avons eu le même problème et voici la solution:

Pour forcer le cadre de l'entité à utiliser une colonne en tant que clé primaire, utilisez ISNULL.

Pour forcer le cadre de l'entité à ne pas utiliser une colonne comme clé primaire, utilisez NULLIF.

Une méthode simple consiste à envelopper l’instruction select de votre vue dans une autre sélection.

Exemple:

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

Réponse populaire

J'ai pu résoudre ce problème en utilisant le concepteur.

  1. Ouvrez le navigateur de modèle.
  2. Trouvez la vue dans le diagramme.
  3. Cliquez avec le bouton droit sur la clé primaire et assurez-vous que "Clé de l'entité" est cochée.
  4. Sélectionner plusieurs fois toutes les clés non primaires. Utilisez les touches Ctrl ou Maj.
  5. Dans la fenêtre Propriétés (appuyez sur F4 si nécessaire pour le voir), définissez le menu déroulant "Clé de l'entité" sur Faux.
  6. Sauvegarder les modifications.
  7. Fermez Visual Studio et rouvrez-le. J'utilise Visual Studio 2013 avec EF 6 et je devais le faire pour que les avertissements disparaissent.

Je n'ai pas eu à changer d'avis pour utiliser les solutions de contournement ISNULL, NULLIF ou COALESCE. Si vous mettez à jour votre modèle à partir de la base de données, les avertissements réapparaîtront, mais disparaîtront si vous fermez et rouvrez VS. Les modifications apportées dans le concepteur seront préservées et ne seront pas affectées par l'actualisation.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow