Как определить DataDirectory для ConnectionString в консольном приложении для работы с EntityFramework Code First Migrations
Я пытаюсь установить местоположениеMyProject\App_Data\Cos.mdf
для базы данных в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>
ВProgram.cs
Я написал:
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();
}
Отображаемый путь (я вставляю его, чтобы показать, что я не ошибся):
но потом, когда я печатаю в консоли диспетчера пакетовenable-migrations
менятьAutomaticMigrations
в true, затем введитеupdate-database
Я получаю ошибку:
Cannot attach the file 'C:\Users\s8359_000\Documents\Visual Studio 2013\Projects\Projekt5 — kopia\Projekt5\bin\Debug\Cos.mdf' as database 'Cos'.
Почему .NET пытается создать мою базу данных вDebug
каталог ?! Я изучил 15 тем в StackOverflow по этой теме, и похоже, что все просто дублируют ответы, которые не работают.
РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТА SRUTZKY Да, вы правы, есть ошибка. Я попробовал еще несколько комбинаций после вашего ответа, к сожалению, ни одна из них не сработала.
<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>
и главное
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();
}
тогда я получаю в консоли:
и после удаленияMigrations
каталог иenable-migrations
, автоматическая миграция к истине,update-database
Я получил:
PM> update-database Укажите флаг '-Verbose' для просмотра операторов SQL, применяемых к целевой базе данных. System.Data.SqlClient.SqlException (0x80131904): произошла ошибка активации файла. Физическое имя файла '\ baza.mdf' может быть неправильным. Диагностируйте и исправьте дополнительные ошибки и повторите операцию. СОЗДАТЬ БАЗУ ДАННЫХ не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) при System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, булева callerHasConnectionLock, булева asyncClose) при System.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds (String methodName, логический асинхронный, тайм-аут Int32, логический asyncWrite) в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuerySourceCom1 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 в) в System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func
3 операция, TInterceptionContext interceptionContext, Action3 executing, Action
3 выполнено) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery (команда DbCommand, DbCommandInterceptionContext interceptionContext) в System.Data.Entity.SqlServer.SqlProviderServices. <> C__Disbate_DateBaseEgn1. .SqlServer.1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action
1 акт) в System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection (DbConnection sqlConnection, Действие1 act) at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable
1 commandTimeout, DbConnection sqlConnection, String createDatabaseScript) в System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase (соединение DbConnection, допускает Nullable)1 commandTimeout, StoreItemCollection storeItemCollection) at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable
1 commandTimeout, StoreItemCollection storeItemCollection) в System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase () в System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create (соединение DbConnection) в System.Data.Entity.Migrations.DM .EnsureDatabaseExists (Действие mustSucceedToKeepDatabase) в System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists (Действие mustSucceedToKeepDatabase) в System.Data.Entity.Migrations.DbMigrator.Update (String targetgragration)) .MigratorBase.Update (String targetMigration) в System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run () в System.AppDomain.DoCallBack (CrossAppDomainDelegate callBackDelegate) в System.AppDomain.DoeateateDack CrossDDoDateBackDD
в System.Data.Entity.Migrations.Design.ToolingFacade.Run (BaseRunner runner) в System.Data.Entity.Migrations.Design.ToolingFacade.Update (String targetMigration, Boolean force) в System.Data.Entity.Migrations.UpdateDatabaseCommand. <> c__DisplayClass2. <. ctor> b__0 () в System.Data.Entity.Migrations.MigrationsDomainCommand.Execute (команда Action) ClientConnectionId: 23ca49c1-4797-4bc3-8f16-f34fd77f2cbe Произошла ошибка активации файла. Физическое имя файла '\ baza.mdf' может быть неправильным. Диагностируйте и исправьте дополнительные ошибки и повторите операцию. СОЗДАТЬ БАЗУ ДАННЫХ не удалось. Некоторые имена файлов не могут быть созданы. Проверьте связанные ошибки. PM>