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):

Comment définir DataDirectory pour ConnectionString dans l'application de la console de travailler avec EntityFramework le Premier Code Migrations

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:

Comment définir DataDirectory pour ConnectionString dans l'application de la console de travailler avec EntityFramework le Premier Code Migrations

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
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection, Action
1 wrapCloseInAction) à
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
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
1 c) à
Système.Les données.De l'entité.L'Infrastructure.L'Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget
target, Func
3 opération, TInterceptionContext interceptionContext,
Action3 executing, Action3 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
operation) at
System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action
operation) at
System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection
sqlConnection, Action
1 acte) à
Système.Les données.De l'entité.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection
sqlConnection, Action1 act) at
System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable
1
commandTimeout, DbConnection sqlConnection, Chaîne
createDatabaseScript) à
Système.Les données.De l'entité.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection
connexion, Nullable1 commandTimeout, StoreItemCollection
storeItemCollection) at
System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection
connection, Nullable
1 commandTimeout, StoreItemCollection
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>

Pas sûr que le Gestionnaire de paquets pu lire votre code, le compiler, exécuter, et de déterminer que vous avez défini une autre valeur pour DataDirectory. C'est une application console donc je pense qu'il s'attend à ce que la base de données à cet endroit.
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