0

Я ожидаю, что это поведение из-за this MSDN article about the AttachDbFileName propertyLocalDB .mdf файл не прилагается автоматически с AttachDbFileName в строке подключения

В первый раз при подключении к базе данных с помощью этой опции в струне соединения, то SQL Экземпляр сервера Express или LocalDB присоединяет базу данных , и она остается прикрепленной. Если вы хотите подключиться к той же базе данных , в будущем вы можете использовать начальный каталог без AttachDbFileName, если хотите.

У меня есть строка соединения, которая используется Entity Framework:

<add name="DatabaseContext" providerName="System.Data.SqlClient" connectionString="Server=(localdb)\MSSQLLocalDB;Database=DatabaseName;Integrated Security=True;AttachDbFileName=|DatabaseName|\DatabaseName.mdf" /> 

Это прекрасно работает после того, как я открыть базу данных в SQL Management Studio питающих этого значение AttachDbFileName с абсолютным путем в качестве дополнительного prameter ,

Но если я не прикрепил его с SQL Management Studio первыми, то я получаю следующее сообщение об ошибке при попытке запуска EF миграции в базе данных:

System.Data.SqlClient.SqlException (0x80131904): Cannot create file 'C:\Users\user\Desktop\folder\DatabaseName.mdf' because it already exists. Change the file path or the file name, and retry the operation. 
CREATE DATABASE failed. Some file names listed could not be created. Check related errors. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 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) 
    at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) 
    at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) 
    at System.Data.Entity.SqlServer.SqlProviderServices.<>c__DisplayClass1a.<CreateDatabaseFromScript>b__19(DbConnection conn) 
    at System.Data.Entity.SqlServer.SqlProviderServices.<>c__DisplayClass33.<UsingConnection>b__32() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation) 
    at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) 
    at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action`1 act) 
    at System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action`1 act) 
    at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable`1 commandTimeout, DbConnection sqlConnection, String createDatabaseScript) 
    at System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection) 
    at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable`1 commandTimeout, StoreItemCollection storeItemCollection) 
    at System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase() 
    at System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection connection) 
    at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 
    at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 
    at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update() 

Это выглядит так, как будто это не по какой-то причине автоматически прикрепите базу данных, а затем попытайтесь создать ее, как будто файл не существует.

Есть ли дополнительная строка строки подключения или конфигурация LocalDB, которая может исправить это, чтобы база данных автоматически подключалась к первому подключению?

ответ

0

Ответ тривиален: файлы .mdf и .ldf были созданы в более новой версии SQL-сервера, поэтому более старая версия не привязывала их, как будто их не было.