EF 6 firebase database en premier: Comment mettre à jour les procédures stockées?

Nous utilisons Entity Framework 6.0.0 et utilisons d’abord la firebase database (comme ceci) pour générer du code à partir de tables et de procédures stockées. Cela semble fonctionner correctement, sauf que les modifications apscopes aux procédures stockées ne sont pas sockets en compte lors de la mise à jour ou de l’actualisation du modèle. L’ajout d’une colonne à une table est répercuté, mais n’ajoute pas de champ à une procédure stockée.

Il est intéressant de noter que si je vais dans le Model Browser , cliquez avec le bouton droit de la souris sur la procédure stockée, sélectionnez Add Function Import et cliquez sur le bouton Get Column Information les colonnes. Cela signifie que le modèle connaît les colonnes, mais ne parvient pas à mettre à jour le code généré.

Il existe une solution de contournement, à savoir supprimer la procédure stockée générée avant de mettre à jour le modèle. Cela fonctionne tant que vous n’avez apporté aucune modification à la procédure stockée. Est-ce que quelqu’un sait comment éviter cette solution?

J’utilise Visual Studio 2013 avec toutes les dernières mises à jour au début de décembre 2013.

Merci d’avance!

Mise à jour 1: la réponse de andersr a aidé dans un cas, où la procédure stockée utilisait une table temporaire, donc je lui ai donné +1, mais cela ne résout toujours pas le problème principal de la mise à jour des procédures stockées simples.

Mise à jour 2: le commentaire de shimron ci-dessous renvoie à une question sur les mêmes problèmes dans EF 3.5. Il semble que la même chose soit toujours vraie pour EF 6.0. Lisez-le pour une autre manière de le faire, mais pour le moment, la manière la plus simple de le faire est de supprimer la procédure stockée générée avant de mettre à jour le modèle. Utilisez des classes partielles si vous voulez faire quelque chose de spécial.

Sur la base de cette réponse de DaveD , ces étapes permettent de résoudre le problème:

  1. Dans votre .edmx , cliquez avec le bouton droit de la souris et sélectionnez Explorateur de modèles .
  2. Dans le navigateur de modèles (dans la configuration par défaut de VS 2015, il s’agit d’un onglet dans l’Explorateur de solutions), développez Importations de fonctions sous le modèle.
  3. Double-cliquez sur votre procédure stockée.
  4. Cliquez sur le bouton Mettre à jour à côté de Renvoie une collection de – complexe (si vous ne retournez pas un scalaire ou une entité)
  5. Cliquez sur OK puis enregistrez votre fichier .edmx pour refléter les modifications apscopes au champ de votre procédure stockée tout au long de votre projet.

Est-ce que vos procédures stockées renvoient des données de tables temporaires par hasard? EF ne semble pas prendre cela en charge, voir EF4 – La procédure stockée sélectionnée ne renvoie aucune colonne pour plus d’informations.

Cependant, la procédure stockée sera, comme vous l’avez observé, disponible dans le navigateur de modèles. J’ai fait un test rapide avec le scénario décrit ci-dessus. La procédure stockée a été générée dans ma classe de contexte, mais le type de retour était un type int plutôt que complexe . Voir le lien ci-dessus pour des solutions potentielles.

Je viens de rencontrer ceci et ma solution de contournement (c’est vraiment désagréable) était de créer une instruction if avec une condition qui ne sera jamais vraie en haut de la procédure stockée qui sélectionne la même liste de sorties que la requête avec transtypage explicite aux types de données Je veux retourner. Cela supposera la nullité de vos types, afin de résoudre que vous envelopper le cast dans un ISNULL

Par exemple, si votre sortie comporte les colonnes:

 UserId (int, not null) RoleId (int, nullable) FirstName (varchar(255), nullable) Created (datetime, not null) 

Vous vous attendez à ce que cela crée un POCO comme:

 SomeClass { public int UserId { get; set; } public int? RoleId { get; set; } public ssortingng FirstName { get; set; } public DateTime Created { get; set; } } 

… Mais ce n’est pas le cas et c’est pourquoi nous sums ici aujourd’hui. Pour contourner cela ne fonctionne pas comme prévu, je mets le suivant en haut de mon SP (juste après le «AS»):

 if(1=0) begin select UserId = isnull((cast(0 as int)),0), RoleId = cast(0 as int), FirstName = cast(0 as varchar), DateTime = isnull((cast(0 as datetime)),'') end 

C’est horrible et moche mais ça marche pour moi à chaque fois. J’espère que nous aurons une mise à jour des outils qui résoudra cela bientôt … il m’est arrivé aujourd’hui sans tables temporaires dans SQL Server 2016 avec VS2015 …

J’espère que ça aide quelqu’un