Problème de connexion à la base de données - problème d'instance utilisateur et d'Entity Framework

StackOverflow https://stackoverflow.com/questions/7381591

Question

J'ai créé un fichier de modèle d'entité (.edmx) basé sur un fichier .mdf dans mon application asp.net, placé dans mon dossier App_Data.

tout d'abord ma chaîne de connexion, créée par l'assistant du framework d'entité:

<connectionStrings>
    <add name="Sales_DBEntities" 
        connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source=.\SQLEXPRESS;attachdbfilename=&quot;c:\users\ext\documents\visual studio 2010\Projects\WebProject_A\WebProject_A\App_Data\Sales_DB.mdf&quot;;integrated security=True;USER INSTANCE=TRUE;multipleactiveresultsets=True;App=EntityFramework'" 
        providerName="System.Data.EntityClient" />
</connectionStrings>

Ce qui précède est placé dans un fichier app.config créé par l'assistant.

J'ai également copié la même chaîne de connexion dans le fichier web.config (je ne sais pas si cela est nécessaire).

J'ai rencontré deux problèmes en essayant d'exécuter plus tard la même application sur ma machine (j'ai créé l'application sur une autre machine).

La première concernait l'instance utilisateur:

Échec de la génération d'une instance utilisateur de SQL Server en raison d'un échec du démarrage du processus pour l'instance utilisateur. La connexion sera fermée

La première chose que je ne comprends pas vraiment, c'est ce qu'une instance utilisateur définit réellement.

Selon MSDN:

Une instance utilisateur est une instance distincte du moteur de base de données SQL Server Express qui est générée par une instance parent

Ma base de données locale est-elle considérée comme une instance utilisateur?

J'aimerais vraiment avoir des éclaircissements à ce sujet car je suis tombé sur des articles suggérant pour le marquer comme faux, et la raison n’était pas claire pour moi.

un autre post sur cette question

À partir de là, je suis tombé sur une autre solution qui explique que pour ce problème, vous devez activer l'instance utilisateur dans SQL Server sur votre ordinateur.

Le correctif

J'ai fait ce qui a été expliqué dans ce post

mais maintenant j'ai rencontré un nouveau problème:

Une tentative d'attacher une base de données nommée automatiquement pour le fichier (Chemin complet vers mon fichier app_data \ mon.mdf) Une base de données portant le même nom existe, ou le fichier spécifié ne peut pas être ouvert, ou il se trouve sur un partage UNC.

/ p>

J'ai déjà tenté de supprimer tous les fichiers sous

 C:\Documents and Settings\(your user account name)\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS

et redémarrage comme suggéré dans d'autres articles, mais je ne trouve toujours pas de solution claire à ce problème.

Je sais que c'est un long article mais toute aide serait appréciée

merci d'avance.

Était-ce utile?

La solution

Lisez ce très bon aperçu de quel utilisateur les instances le sont vraiment .

En un mot:

  • SQL Server vous permet d'avoir plusieurs instances de lui-même sur un seul ordinateur - l'instance par défaut est accessible en utilisant uniquement le nom de la machine (ou l'adresse IP) de la machine hôte - tout les autres instances doivent être spécifiées par un nom d'instance (comme le SQLExpress sur votre ordinateur)

  • à des fins de développement, vous pouvez également créer une instance utilisateur - chaque utilisateur obtient sa propre instance distincte de SQL Server (fonctionne uniquement dans l ' édition Express ) et une base de données est attachée par son nom de fichier (path\Sales_DB.mdf) à cette instance utilisateur. Cette instance est démarrée à la demande, puis s'exécute et s'arrête lorsqu'elle n'est plus nécessaire

Bien que cela fonctionne très bien pour le développement, ce n'est pas vraiment prévu pour plus tard - certainement pas pour une utilisation en production.

Dans un environnement de production, vous souhaitez attacher vos fichiers de base de données à l'instance SQL Server réelle sur laquelle ils doivent s'exécuter, généralement à l'aide de SQL Server Management Studio. Lorsque vous faites cela, vous ne faites plus référence à cette base de données via son nom de fichier , mais vous utilisez à la place le nom de la base de données qui a été donné à la base de données lors de sa connexion au serveur. . Dans ce cas, SQL Server gérera tous les détails des opérations - et cette instance de SQL Server est opérationnelle en permanence (n'a pas besoin d'être démarrée «à la demande» tout le temps), et vous pouvez utiliser des éléments tels que les autorisations et connexions pour contrôler l'accès à la base de données.

Votre chaîne de connexion ressemblerait alors à ceci:

<connectionStrings>
    <add name="Sales_DBEntities" 
         connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='server=YourServerNameHere;database=Sales_DB;integrated security=True;App=EntityFramework'" 
        providerName="System.Data.EntityClient" />
</connectionStrings>

Lorsque vous avez attaché une base de données à une instance SQL Server de production (ou de test), vous n'avez pas besoin de savoir quels sont les fichiers qui composent la base de données, et vous n'avez pas besoin de spécifier ces fichiers - SQL Server prends soin de ça. Vous faites simplement référence à la base de données via son nom de base de données .

Autres conseils

La solution est toujours plus simple que prévue:

  1. double-cliquez sur le fichier model.edmx -> le concepteur s'ouvrira.
  2. faites un clic droit sur le concepteur -> Update model from database.
  3. nouvelle connexion -> Choose Database file (.mdf) sous type.
  4. Parcourir -> allez dans votre dossier App_Data et choisissez la base de données.
  5. copiez la chaîne de connexion créée dans App.config dans web.config.

au revoir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top