Comment définir DataDirectory pour ConnectionString dans l'application de la console de travailler avec EntityFramework le Premier Code Migrations
J'essaie de définir l'emplacement MyProject\App_Data\Cos.mdf
pour la base de données dans App.config
:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\Cos.mdf;Initial Catalog=Cos;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Dans Program.cs
j'ai écrit:
static void Main(string[] args) {
string relative = @"..\..\App_Data\Cos.mdf";
string absolute = Path.GetFullPath(relative);
AppDomain.CurrentDomain.SetData("DataDirectory", absolute);
Console.WriteLine(absolute);
Console.ReadKey();
}
Le chemin affiché est(je le coller pour montrer que je n'ai pas fait une erreur):
mais ensuite quand je tape dans la Console du Gestionnaire de Package enable-migrations
changement AutomaticMigrations
à true, alors le type de update-database
j'obtiens l'erreur:
Cannot attach the file 'C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\bin\Debug\Cos.mdf' as database 'Cos'.
Pourquoi .NET essaie de créer ma base de données dans Debug
répertoire?! Je suis allé à travers 15 sujets sur StackOverflow sur ce sujet et il semble que tout le monde ne duplique les réponses qui ne fonctionnent pas.
MODIFIER APRÈS LA RÉPONSE DE SRUTZKY
Oui vous avez raison il y a une erreur. J'ai essayé quelques-uns plus de combinaison après votre réponse, malheureusement aucun n'a fonctionné.
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\baza.mdf;Initial Catalog=baza;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
et les Principaux
static void Main(string[] args) {
Console.WriteLine("BEFORE:" + AppDomain.CurrentDomain.GetData("DataDirectory"));
string relative = @"..\..\App_Data\Cos.mdf";
string absolute = Path.GetFullPath(relative);
absolute = Path.GetDirectoryName(@absolute);
AppDomain.CurrentDomain.SetData("DataDirectory", @absolute);
Console.WriteLine(@absolute);
Console.WriteLine(AppDomain.CurrentDomain.GetData("DataDirectory"));
Console.ReadKey();
}
puis-je obtenir dans la console:
et après la suppression de Migrations
répertoire et enable-migrations
, les migrations automatiques de vrai, update-database
j'obtiens:
H> mise à jour de la base de données de Spécifier l'option-Verbose' drapeau pour afficher le SQL
états être appliqué à la base de données cible.
Système.Les données.SqlClient.SqlException (0x80131904): Un fichier d'activation
erreur s'est produite. Le nom de fichier physique " \baza.mdf' est peut-être incorrect.
Diagnostiquer et de corriger les autres erreurs, et recommencez l'opération.
CRÉER une BASE de données a échoué. Certains noms de fichier répertoriés n'a pas pu être créé.
Vérifier les erreurs liées. au
Système.Les données.SqlClient.SqlConnection.OnError(exception SqlException,
Valeur de type Boolean breakConnection, Action1 wrapCloseInAction) at
1 wrapCloseInAction) à
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
Système.Les données.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) à
Système.Les données.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj, Boolean& dataReady) à
Système.Les données.SqlClient.SqlCommand.RunExecuteNonQueryTds(String
methodName, Boolean async, Int32 délai d'attente, Boolean asyncWrite) à
Système.Les données.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1
1 c) à
completion, String methodName, Boolean sendToPipe, Int32 timeout,
Boolean asyncWrite) at
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at
System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand
t, DbCommandInterceptionContext
Système.Les données.De l'entité.L'Infrastructure.L'Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget
3 opération, TInterceptionContext interceptionContext,
target, Func
Action3 executing, Action
3 exécutés) à
Système.Les données.De l'entité.L'Infrastructure.L'Interception.DbCommandDispatcher.NonQuery(DbCommand
commande, DbCommandInterceptionContext interceptionContext) à
Système.Les données.De l'entité.SqlServer.SqlProviderServices.<>c__DisplayClass1a.b__19(DbConnection
conn) à
Système.Les données.De l'entité.SqlServer.SqlProviderServices.<>c__DisplayClass33.b__32()
au
Système.Les données.De l'entité.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.b__0()
au
Système.Les données.De l'entité.SqlServer.DefaultSqlExecutionStrategy.Exécutez[TResult](Func1
1 acte) à
operation) at
System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action
operation) at
System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection
sqlConnection, Action
Système.Les données.De l'entité.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection
sqlConnection, Action1 act) at
1
System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable
commandTimeout, DbConnection sqlConnection, Chaîne
createDatabaseScript) à
Système.Les données.De l'entité.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection
connexion, Nullable1 commandTimeout, StoreItemCollection
1 commandTimeout, StoreItemCollection
storeItemCollection) at
System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection
connection, Nullable
storeItemCollection) à
Système.Les données.De l'entité.De base.Objets.ObjectContext.CreateDatabase() à
Système.Les données.De l'entité.Les Migrations.Utilitaires.DatabaseCreator.Créer(DbConnection
de connexion) à
Système.Les données.De l'entité.Les Migrations.DbMigrator.EnsureDatabaseExists(Action
mustSucceedToKeepDatabase) à
Système.Les données.De l'entité.Les Migrations.L'Infrastructure.MigratorBase.EnsureDatabaseExists(Action
mustSucceedToKeepDatabase) à
Système.Les données.De l'entité.Les Migrations.DbMigrator.Mise À Jour(String
targetMigration) à
Système.Les données.De l'entité.Les Migrations.L'Infrastructure.MigratorBase.Mise À Jour(String
targetMigration) à
Système.Les données.De l'entité.Les Migrations.De la conception.ToolingFacade.UpdateRunner.Run()
au Système.Domaine d'application.DoCallBack(CrossAppDomainDelegate
callBackDelegate) à
Système.Domaine d'application.DoCallBack(CrossAppDomainDelegate callBackDelegate)
au Système.Les données.De l'entité.Les Migrations.De la conception.ToolingFacade.Exécuter(BaseRunner
coureur)
Système.Les données.De l'entité.Les Migrations.De la conception.ToolingFacade.Mise À Jour(String
targetMigration, Boolean force) au
Système.Les données.De l'entité.Les Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
au
Système.Les données.De l'entité.Les Migrations.MigrationsDomainCommand.Execute(Action
de commande) ClientConnectionId:23ca49c1-4797-4bc3-8f16-f34fd77f2cbe Un
l'activation du fichier erreur s'est produite. Le nom de fichier physique " \baza.mdf " peut
être incorrect. Diagnostiquer et de corriger les autres erreurs, et retenter l'
le fonctionnement. CRÉER une BASE de données a échoué. Certains noms de fichier dans la liste pourrait ne pas être
créée. Vérifier les erreurs liées. H>
Avant l'invocation de
SetData
la Console.WriteLine(AppDomain.CurrentDomain.GetData("DataDirectory"));
imprimé chaîne vide, après SetData, imprimer le bon de chaîne:'C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\App_Data\Cos.mdf'
PackageManagerConsole probablement voit mon code parce que si je n'ai pas utilisé
SetData
méthode, update-database
serait de créer une base de données dans C:\Users\s8359_000\DATABASEFILE.mdf
.OriginalL'auteur Yoda | 2015-01-01
Vous devez vous connecter pour publier un commentaire.
Problème 1 (de 2)
Lorsque vous définissez la valeur de
DataDirectory
, il doit être un répertoire, pas un fichier. Vous êtes de passage dans la valeur de laabsolute
variable qui est:et qui contient le nom de fichier. Qui n'est pas valide.
DataDirectory
est une valeur de substitution, afin de préciser:dans la chaîne de connexion devrait se traduire par:
Qui n'est pas un chemin d'accès valide. Il semble donc que .NET voit que la valeur de
DataDirectory
n'est pas valide et ne l'utilisez pas et donc commence dans le répertoire de travail courant.Utilisation
Path.GetDirectoryName(relative)
au lieu dePath.GetFullPath(relative)
pour définir la valeur deabsolute
et cela devrait fonctionner car il va définir la valeur deDataDirectory
:La page MSDN pour Les Chaînes De Connexion a quelques détails supplémentaires vers le bas, dans la section intitulée "Appui à la |DataDirectory| Chaîne de Substitution..."
Problème 2 (de 2)
Update-Database
) n'ont pas accès au domaine d'application de la console de votre application lorsque vous définissez la valeur de "DataDirectory".Je ne sais pas comment faire par programmation d'interagir avec le Gestionnaire de Package, mais j'ai réussi à comprendre comment par programmation à l'incendie de la "mise à jour de la base de données". Il suffit d'ajouter la ligne suivante juste après vous définissez la valeur de "DataDirectory":
Vous aurez également besoin d'au moins un, sinon deux,
using
états:using System.Data.Entity;
using ProjectName.Migrations; //namespace of Migrations\Configuration.cs
Veuillez noter que cela ne suffit pas à créer la base de données. Toutes les modifications en attente seront publiés lors de la première accès la base de données via le DbContext.
Exemple:
Aussi, vous pourrait besoin d'appeler le suivant, en même temps, via le Gestionnaire de Package (il ne veut pas faire quelque chose immédiatement à la base de données de sorte que la chaîne de connexion n'est pas accessible):
Pour plus d'informations, veuillez consulter la page MSDN pour Le Premier Code Des Migrations.
Une fois cette ligne de code pour appeler
SetInitializer
est là, avecMigrateDatabaseToLatestVersion
, il est là pour ça: à chaque fois qu'il s'exécute (qui est pourquoi ce qui est fait au début de l'application de console) il se synchronise tous les changements entre ce qui est du "modèle" (qui est maintenant compilé dans l'Assemblée) et de la base de données, en s'assurant que la base de données dispose de la dernière version. Cela suppose que toutes les nouvelles tables sont représentées dans leDbContext
classe. Mais aucun autre Gestionnaire de paquets commandes ont besoin d'être couru.Je ne vais pas avoir le temps jusqu'à plus tard aujourd'hui de jouer avec cela, mais je me demandais si vous avez besoin d' "\\" au lieu de "\" dans la chaîne de connexion (c'est à dire "\\baza.mdf"). Une autre chose: je voudrais bien, pour l'instant, supprimer "|DataDirectory|" et l'utilisation codé en dur chemin complet jusqu'à ce que cela fonctionne, et puis essayer d'obtenir "|DataDirectory|" au travail.
Codé en dur chemin d'accès complet fonctionne, j'ai vérifié avant que j'ai posté cette question sur. C'est un problème général à qui je suis à la recherche d'une solution(pour l'avenir).
Il a travaillé. La dernière question, alors maintenant, je ne peux pas utiliser la mise à jour de la base de données à l'intérieur de la Console du Gestionnaire de Package, mais si je veux mettre à jour de modèle courant, il suffit d'exécuter l'application de débogage?
J'ai testé et ajouté un dernier alinéa à ma réponse. Toutes les modifications sont synchronisées à chaque fois que vous exécutez l'application console. Pas besoin de faire quoi que ce soit dans le Gestionnaire de Package.
OriginalL'auteur Solomon Rutzky
Vous pouvez définir DataDirectory pour la mise à Jour de la Base de données de Configuration de la classe qui a été créé par Activer les Migrations de commande:
Solution Simple et élégante! Bravo!
OriginalL'auteur Rasul
Au point de la DataDirectory dans un dossier nommé "AppData" en vertu de la console de projet et EF migrations code first, vous devez effectuer les opérations suivantes:
Alors appel
AppData.Set()
à partir du point d'entrée de l'application de console et les migrations de base de données:1) de la Console Principale de l'application de la méthode ou de Démarrage-catégorie:
2) EF code premières migrations
OriginalL'auteur Samuli Haverinen