Не вдається вкласти файл * .mdf як базу даних


74

В основному я дотримувався підручника і вирішив видалити .mdfфайл згодом.

Тепер, коли я намагаюся запустити програму, я отримую таку помилку (заголовок цієї теми). Код, де я отримую помилку, показаний нижче (ASP.NET MVC 4):

OdeToFoodDB db = new OdeToFoodDB();

public ActionResult Index()
{
    var model = db.Restaurants.ToList();
    return View(model);
}

Мій рядок підключення такий:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=OdeToFoodDb;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

Я спробував розглянути Провідник об'єктів SQL Server, але він виглядає так:

Крім того, у провіднику сервера я не бачу жодних з'єднань даних.

І коли я намагаюся додати нове з’єднання в Провідник сервера, я не бачу жодної іменованої бази даних OdeToFoodDb.

Вибачте за це широке запитання, але я новачок у Entity Framework і не зовсім розумію, що тут не так.


4
Ви говорите, що видалили файл .mdf. Це файл бази даних SQL Server. Якщо ви його видалили, бази даних немає, звідси і помилка.
STLDev

Хотів сказати те саме, що @STLDeveloper, Як код може продовжуватись, якщо він не знаходить необхідну БД ...
Овайс Куреші,

Після компіляції є OdeToFooDb.mdf у папці bin \ Debug \ App_Data вашого проекту mvc?
рене

2
@rene Ні. Файлів mdf взагалі немає. Як створити файл mdf?
Джон Майєр

1
@rene Файл mdf взагалі відсутній. Я спробував перейменувати клас dbcontext і зараз він працює. Що могло спричинити проблему?
John Mayer

Відповіді:


60

Погляньте на це: Entity Framework не створює базу даних

Я спробував би дати базі даних інше ім'я. Іноді ви можете зіткнутися з проблемами з SQL Express при спробі створити базу даних з тим самим іменем вдруге. Існує спосіб виправити це за допомогою SQL Server Management Studio, але, як правило, простіше просто використовувати інше ім’я бази даних.

Редагувати Цю відповідь прийнято, оскільки вона підтверджує помилку та обхідний шлях, використаний OP (перейменування бази даних може допомогти ). Я повністю згоден з тим, що перейменування бази даних насправді не є прийнятним способом і не вирішує проблему повністю . На жаль, я не перевірив інші способи реально це вирішити в SSMS.


3
Я б дуже хотів знати це виправлення за допомогою SSMS, оскільки у мене така сама проблема, і я хотів би зберегти ім’я бази даних незмінним.
julealgon

Так, будь ласка @Chris, як ви вирішити цю проблему з SSMS?
Ян Кемпбелл,

@julealgon, що цей процес пояснено тут
Bogac

3
Вам не потрібно цього робити, лише видаліть базу даних з (та тісних зв’язків) з Visual Studio Перегляд об’єктів SQL Server Object Explorer
Себастьян Рохас,

Я не думаю, що це хороший спосіб і абсолютно непридатний для виробничих систем.
Xan-Kun Clark-Davis

124

Я думаю, що для SQL Server Local Db ви не повинні використовувати Initial Catalogвластивість. Пропоную скористатися:

<add name="DefaultConnection" 
     connectionString="Data Source=(LocalDb)\v11.0;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\OdeToFoodDb.mdf" 
     providerName="System.Data.SqlClient" />

Я думаю, що локальний db не підтримує кілька баз даних в одному і тому ж файлі mdf, тому вкажіть початковий каталог не підтримується (або не підтримується добре, і у мене є деякі дивні помилки).


18
Видалення частини "Початковий каталог" із рядка підключення вирішило цю проблему для мене.
Тім Фрізен

2
Всі інші пропозиції були цілком надмірними. Це було просто, стисло і працювало.
Jammer

Це стосується справжньої проблеми. Звичайно, ви можете вказати назву каталогу.
Xan-Kun Clark-Davis

8
Це фактична відповідь на проблему або кращий спосіб вирішити проблему принаймні для цієї помилки. Офіційна відповідь на це питання неправильна.
Nathan McKaskle

2
Іншими словами, для localdb вам потрібно замінити "початковий каталог = ..." на "AttachDBFilename = ...", інакше у вас будуть випадкові SqlExceptions при спробі відкрити з'єднання.
seguso

35
  1. З запуску консолі диспетчера пакетів:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0

  2. Запустіть свій проект

  3. Зареєструйте користувача

Замість того , щоб v11.0увійти , MSSQLLocalDBщо в мережі рядок з'єднання конфігурації, як цеdata source=(LocalDb)\MSSQLLocalDB;...
Zoha

16

Видаліть цей рядок із рядка підключення, який повинен це зробити;) "AttachDbFilename = | DataDirectory | whateverurdatabasenameis-xxxxxxxxxx.mdf"


Працював і у мене. Це, мабуть, має бути відповіддю.
Matt West

11
Чекай. Що? Або ви хочете вказати db-файл, тоді вам цілком потрібен цей рядок, або ні. Тоді ви абсолютно повинні опустити цей рядок. Це жодним чином не вирішує основну проблему.
Xan-Kun Clark-Davis

6

"Не вдається вкласти файл 'C: \ Github \ TestService \ TestService \ App_data \ TestService.mdf" як базу даних "TestService"

Коли ви зустрінете вищезазначене повідомлення про помилку, виконайте такі дії.

  1. Відкрийте Провідник об’єктів SQL Server
  2. Натисніть кнопку оновлення.
  3. Розгорніть (localdb) \ MSSQLLocalDB (SQL Server 12.x.xxxxx - xxxxx \ xxxx)
  4. Розгорніть базу даних
  5. Будь ласка, видаліть існуючу базу даних з однаковим іменем
  6. Клацніть правою кнопкою, а потім видаліть
  7. Поверніться до консолі управління пакетами
  8. Оновлення-база даних

5

Я стикався з тим самим питанням. Наступні кроки у VS 2013 вирішили проблему для мене:

  1. У Провіднику сервера додайте нове Підключення до бази даних
  2. Виберіть файл бази даних Microsoft SQL Server як джерело даних
  3. Виберіть ім'я файлу бази даних, як воно повинно бути, відповідно до рядка підключення у вашому web.config
  4. Створено новий файл бази даних, а в Провіднику сервера з’явилося два підключення до бази даних: "MyDatabaseName" і "MyDatabaseName (MyProjectName)"
  5. Видалити одне підключення (я видалив "MyDatabaseName")

:-) Мені здається, що ви одного разу видалили файл mdf через провідник, а не за допомогою Database.Delete (); команди.
Xan-Kun Clark-Davis

3

Щоб виправити це за допомогою SQL SERVER Management Studio

Ваша проблема: Ви отримуєте повідомлення про помилку, наприклад "Не вдається вкласти файл" YourDB.mdf "як базу даних" YourConnStringNamedContext ";

Причина: трапляється тому, що ви видалили файли резервної копії .mdf, ldf, фактично не видаливши базу даних у запущеному екземплярі SqlLocalDb; повторний запуск коду у VS не допоможе, оскільки ви не можете заново створити БД з тим самим іменем (і тому перейменування працює, але старе ім'я фантома db лежить навколо).

Виправлення: я використовую VS2012, прийняти аналогічно для іншої версії.

Перейдіть до нижнього шляху та введіть

c: \ program files \ microsoft sql server \ 110 \ Tools \ Binn> sqllocaldb інформація

Вище cmd показує імена екземплярів, включаючи 'v11.0'

Якщо екземпляр вже запущений, введіть у підказці

Інформація про sqllocaldb v11.0

Зверніть увагу на таку інформацію Власник: YourPCName \ Ім’я користувача, стан: Запуск, ім’я каналу екземпляра: np: \. \ Pipe \ LOCALDB # 12345678 \ tsql \ query, де 123456789 - це випадкові буквено-цифрові

Якщо State не запущений або зупинений, запустіть екземпляр з

Початок sqllocaldb v11.0

та витягніть ту саму інформацію, що і вище.

У діалоговому вікні SS Connect Studio 'Connect' введіть

ім'я сервера: np: \. \ pipe \ LOCALDB # 12345678 \ tsql \ query

auth: автентифікація Windows

ім'я користувача: (те саме, що і Власник, воно недоступне для Win. auth.)

Після підключення знайдіть фантомну БД, яку ви видалили (наприклад, YourDB.mdf повинен був створити базу даних з іменем YourDB), і дійсно видаліть її.

Готово! Після того, як його не буде, VS EF не повинен мати проблем із її повторним створенням.


2

У вас вже є стара копія цієї бази даних, інстальована у Провіднику серверів. Отже, це просто зіткнення імен у Server Object Explorer / SQL сервері. Ви, ймовірно, створили ту саму назву каталогу бази даних ще до того, як вирішили перенести її в папку Apps_Data. Таким чином, назва бази даних уже існує і її просто потрібно видалити.

Просто зайдіть у Visual Studio> Перегляд> Провідник об’єктів SQL Server і видаліть старе ім’я бази даних та його з’єднання. Повторіть спробу своєї програми ще раз, і вона повинна встановити файл .mdf у App_Data і створити ту саму базу даних знову в Провіднику сервера.


1
це правильна відповідь, оскільки вона насправді вирішує основну проблему. інша відповідь забезпечує лише обхідний шлях.
Нік Флітвуд

Правильно, це та відповідь від @YTKim - усі інші відповіді все ще залишають старе посилання на базу даних, яке сидить у конфігурації LocalDB, і не вирішить ту саму проблему двічі.
Самуель Яєшке

1

Відповідно до @ davide-icardi, видаліть "Початковий каталог = xxx;" з web.config, але також перевірте, чи файл профілю Azure публікує його, щоб також видалити його звідси:
[YourAspNetProject path] \ Properties \ PublishProfiles [YourAspNetProjectName] .pubxml

<PublishDatabaseSettings>
  <Objects xmlns="">
    <ObjectGroup Name="YourAspNetProjectName" Order="1" Enabled="True">
      <Destination Path="Data Source=AzureDataBaseServer;Initial Catalog=azureDatabase_db;User ID=AzureUser_db_sa@AzureDataBaseServer;Password=test" />
      <Object Type="DbCodeFirst">
        <Source Path="DBMigration" DbContext="YourAspNetProjectName.Models.ApplicationDbContext, YourAspNetProjectName" MigrationConfiguration="YourAspNetProjectName.Migrations.Configuration, YourAspNetProjectName" Origin="Configuration" />
      </Object>
    </ObjectGroup>
  </Objects>
</PublishDatabaseSettings>

1

Я виявив, що коментування розділу контексту, який використовувався для ініціалізації бази даних, вирішило проблему. Хавнт встиг з'ясувати, що ще було з заявами про засівання, але вилучення засіву вирішило проблему.


1

У мене трапилася та сама помилка, дотримуючись підручника "Початок роботи з ASP.NET MVC 5 | Документи Microsoft". Я був у Visual Studio 2015. Я відкрив View-> SQL Server Object Explorer і видалив базу даних, названу після підручника, тоді вона могла працювати. див. Видалення .mdf-файлу з app_data викликає виняток. Не вдається приєднати файл як базу даних


1

Натрапив на це питання. Викликано в моєму випадку шляхом видалення .mdf, поки iispexress все ще працював, і тому все ще використовує БД. Клацніть правою кнопкою миші на iisexpress у системному треї та клацніть вихід, а потім видаліть MDF, щоб запобігти цій помилці насправді.

Щоб виправити цю помилку просто в VS, клацніть правою кнопкою миші папку App-Data, додайте новий елемент> База даних SQL Server. Ім'я: [використовуйте ім’я бази даних, надане помилкою оновлення бази даних] Натисніть Додати.


1

Просто змініть назву бази даних із файлу рівня веб-проекту web.config, а потім оновіть базу даних.

connectionString = Джерело даних = (LocalDb) \ MSSQLLocalDB; AttachDbFilename = "| DataDirectory | \ aspnet-Назва проекту-2018041307050 6 .mdf"; Початковий каталог = "aspnet - 2018041307050 6 "; Інтегровано

Змініть жирну цифру на інше число:

connectionString = Джерело даних == (LocalDb) \ MSSQLLocalDB; AttachDbFilename = "| DataDirectory | \ aspnet-Назва проекту-2018041307050 7 .mdf"; Початковий каталог = "aspnet - 2018041307050 7 "; Інтегровано


1

Я не прочитав усіх відповідей, але якщо ваш .mdfфайл НЕ є частиною шляху встановлення SQL, наприклад C:\Temp, тоді облікові записи служби SQL Database Engine не матимуть дозволу створювати та записувати у .ldfфайл або навіть читати .mdfфайл .

Рішення полягає в тому, що вам потрібно надати дозволи для файлової системи обліковому запису служби обробки даних бази даних SQL Server, який запускає службу екземпляра SQL. Отже, для мене я надав дозволи повного контролю через Провідник Windows моєму C:\Tempшляху, що містив мій .mdfфайл для NT Service\MSSQL$SQLEXPRESS01іNT Service\MSSQL$MSSQL2016 облікових записів .

Ось стаття корпорації Майкрософт, де докладно описується саме ця проблема.


0

Відтворіть свою базу даних. Не видаляйте його, і ваш додаток повинен продовжувати працювати.


4
Вибачте за німе запитання, але як мені відтворити базу даних?
John Mayer

О, це може бути гірше, ніж я думав. У вас десь є копія файлу .mdf? Звідки ви це взяли спочатку? Можливо, у вас є сценарій SQL Server, який заново створить базу даних для вас.
STLDev

Вибачте за пізню відповідь: я згенерував його з таким кодом: public class OdeToFoodDB : DbContext { public DbSet<Restaurant> Restaurants { get; set; } public DbSet<RestaurantReview> Reviews { get; set; } } А потім ініціалізую (але тут я отримую помилку): OdeToFoodDB db = new OdeToFoodDB(); public ActionResult Index() { var model = db.Restaurants.ToList(); return View(model); }
Джон Майер

Я спробував перейменувати клас dbcontext і зараз він працює. Що могло спричинити проблему?
John Mayer

0

У мене була та ж помилка. Дивно було те, що у мене був один новий проект з нуля, там він спрацював чудово, і інший, набагато більший проект, де я завжди стикався з цим повідомленням про помилку.

Досконало працюючий проект (майже) завжди створює базу даних (включаючи файли) автоматично. Це може бути будь-яка команда, читання, запис, оновлення. Файли створюються. Звичайно, він використовує

DropCreateDatabaseIfModelChanges

Існує лише один випадок, коли це заважає: ЯКЩО mdf створюється автоматично, і ви видаляєте mdf та файл журналу. Тоді це було про це. Попрощайтеся зі своїм автовідпуском ...

Єдиний спосіб, який я знайшов, щоб це виправити, був такий, як згаданий:

sqllocaldb stop v11.0 & sqllocaldb delete v11.0

Після цього все повертається до звичного стану (і всі інші Бази даних, якими обробляє LocalDB, також зникли!).

EDIT: Це було неправдою. Я щойно спробував, і v11.0 автоматично відтворюється, і всі mdfs залишаються доступними. Я не пробував із "не заснованими на файлах" LocalDB.

Збиває з пантелику те, що я також отримав цю помилку, якщо щось інше було не так. Тож моя пропозиція полягає в тому, що якщо ви хочете переконатися, що ваша установка DB є надійною та надійною: створіть нове рішення / проект з нуля, використовуйте найосновніші команди DB (додайте сутність, покажіть усі сутності, видаліть усі сутності) і див. якщо це працює.

Якщо ТАК, проблема десь у безодні конфігурації та версій VS2013 та nuget та інше.

ЯКЩО НІ, у вас проблема з установкою LocalDB.

Для тих, хто справді хоче зрозуміти, що відбувається в EF (і я досі не впевнений, що так :-)) http://odetocode.com/Blogs/scott/archive/2012/08/14/a-troubleshooting- guide-for-entity-framework-connections-amp-migrations.aspx

PS: Підштовхніть мене, якщо вам потрібен запущений приклад проекту.


0

Дивно, але для тієї самої проблеми мені допомогло зміна значення 'на' v11.0 'у наступному розділі конфігурації.

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>

0

Нещодавно я зіткнувся з тією ж проблемою. Ось одне, що потрібно перевірити. у візуальній студії є три місця, які ми повинні перевірити та видалити базу даних.

1. Solution Explorer's App_Data folder
2. Server Explorer's Data Connection menu
3. SQL Server Object Explorer

Коли я видаляю базу даних із перших двох точок, помилка все одно виникає. Отже, мені також потрібно було видалити базу даних із Провідника об’єктів SQL Server. Тоді я міг легко запустити команду 'update-database' без помилок. Сподіваюся, це допомагає.


0

Ми щойно зіткнулися з цим, запустивши dotnet ef database updateASP.Net Core 2.1; схоже, що відносні шляхи не підтримуються AttachDbFileName.

System.Data.SqlClient.SqlException (0x80131904): Cannot attach the file '.\OurDbName.mdf' as database 'OurDbName'.

Просто хотів висловити це тут для інших людей, які можуть натрапити на це. "Виправлення" полягає у використанні абсолютних шляхів.

Дивіться також: https://github.com/aspnet/EntityFrameworkCore/pull/6446


0

Якщо ви вже застосували міграції, це може це виправити.

Зайдіть на веб-сторінку Web.config та оновіть рядок підключення на основі файлів міграції.

Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-GigHub-201802102244201.mdf;Initial Catalog=aspnet-GigHub-201802102244201;

Датесерси повинні відповідати першим цифрам у вашому перенесенні.


0

Натрапив на подібну проблему не зовсім однаково. Випадок бази даних уже існував, проблема була вирішена за допомогою наступного коду.

<add name="DefaultConnection" connectionString="Data Source=.;AttachDbFilename=|DataDirectory|\aspnet-EjournalParsing-20180925054839.mdf;Initial Catalog=aspnet-EjournalParsing-20180925054839;Integrated Security=True"
      providerName="System.Data.SqlClient" />


Видаліть той самий файл у джерелі даних і вкажіть своє місцезнаходження, яке може бути локальним або серверним
Sumanstm21,

0

У моєму випадку видалення Initail Cataloge=....з рядка підключення вирішило проблему

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.