EF 6 première base de données: Comment mettre à jour les procédures stockées?

nous utilisons Entity Framework 6.0.0 et utilisons d'abord la base de données (comme ceci) pour générer du code à partir des tables et des procédures stockées. Cela semble bien fonctionner, sauf que les changements dans les procédures stockées ne sont pas pris en compte lors de la mise à jour ou de la mise à jour du modèle. L'ajout d'une colonne à une table est réfléchi, mais pas l'ajout d'un champ à une procédure stockée.

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

Il y a une solution, c'est de supprimer la procédure stockée générée avant de mettre à jour le modèle. Cela fonctionne tant que vous n'avez pas fait de modifications de la procédure stockée. Quelqu'un sait-il comment éviter ce contournement?

j'utilise Visual Studio 2013 avec toutes les dernières mises à jour début décembre 2013.

Merci d'avance!

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

mise à Jour 2: schimron de commentaire ci-dessous liens vers une question sur les mêmes questions dans EF 3.5. Il semble qu'il en soit de même pour L'EF 6.0. Lire pour une autre façon de le faire, mais ma conclusion pour l'instant est que la façon 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 cours partiels si vous voulez faire quelque chose de chic.

42
demandé sur Halvard 2013-12-11 15:55:12

3 réponses

basé sur cette réponse par DaveD , ces étapes traitent de la question:

  1. dans votre .edmx , rt-cliquez et sélectionnez navigateur de modèle .
  2. dans le navigateur du modèle (dans la configuration par défaut VS 2015, c'est un onglet dans L'Explorateur de solutions), étendre fonction importe sous le modèle.
  3. double-cliquez votre procédure stockée.
  4. cliquez sur le bouton Update à côté de retourne une Collection de - Complexe (si vous ne retournez pas un scalaire ou une entité)
  5. , Cliquez sur ok puis enregistrer votre .edmx pour refléter les changements de terrain à votre procédure stockée tout au long de votre projet.
83
répondu Rick V 2017-05-23 12:26:05

est-ce que vos procédures stockées renvoient des données de tables temporaires par hasard ? EF ne semble pas supporter cela, 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 avez observé, être disponible dans le navigateur de modèle. J'ai fait un test rapide, mettant en vedette 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 int plutôt qu'un type complexe . Voir le lien ci-dessus pour les solutions potentielles.

2
répondu andersr 2017-05-23 12:18:10

je viens de rencontrer ceci et mon contournement (il est vraiment désagréable) était de créer une instruction if avec une condition qui ne sera jamais vraie au sommet de la procédure stockée qui sélectionne la même Liste de sorties que la requête avec moulage explicite aux types de données que je veux retourner. Cela supposera la nullité de vos types, afin de résoudre que vous envelopper la fonte dans un ISNULL

par exemple, si votre sortie a 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 string FirstName { get; set; }
    public DateTime Created { get; set; }
}

...Mais ce n'est pas le cas et c'est pourquoi nous sommes ici aujourd'hui. Pour contourner ce qui ne fonctionne pas comme prévu, j'ai mis ce qui suit 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 laid mais ça marche pour moi à chaque fois. Espérons que nous aurons une mise à jour de l'outillage qui résoudra cela bientôt...cela m'est arrivé aujourd'hui avec aucune table temporaire dans SQL Server 2016 w/VS2015...

Espérons que cela aide quelqu'un

0
répondu How 'bout a Fresca 2016-08-13 03:12:40