Не сохраняется добавление записи в БД, EF

TheOwl

Есть банальная табличка

Создана она как локальная база (.mdf) Пишу добавление:

ProjEntities context = new ProjEntities();
context.Tables.Add(new Table
{ ProductName = "Book", Price = 85
});
context.SaveChanges();

Изменения не добавлялись в базу. Хотя, если сразу за сохранением с контекста выбрать записи в список, то добавленная запись есть.

1 ответ

TheOwl

Под локальной базой обчыно подразумевается подключение к SQL Express / SQL Local DB с указанием AttachDBFileName = |DataDirectory|\mydatabase.mdf.

|DataDirectory| в случае не-ASP.NET приложения означает "та папка, в которой лежит exe файл". Т.е. это скорее всего не папка проекта, в которой лежат исходники, а папка bin.

Т.е. при указании пути через |DataDirectory| программа работает не с mdf-файлом, добавленным в проект, а с его копией в bin.

Это не является спецификой EF, то же самое происходит и при ручной работе с SQL через ADO.NET.

Поэтому при таком способе подключения обычно проявляются две связанных проблемы.

  • Изменения, внесенные программой "не видны" в базе данных. Причина - программа работает с копией файла в bin, а разработчик проверяет на наличие изменений оригинал в папке проекта.

    Исправляется просмотром файла из bin.

  • Изменения, внесенные программой, теряются при перезапуске программы из студии (по F5 / Ctrl + F5). Причина - mdf файл по умолчанию добалвятеся проект с Build Action = Content, и настройкой Copy To Output Folder = Always. Это означает, что при перестроении приложения (при повторном его запуске из студии) файл базы из проекта копируется в папку bin, заменяя лежащий там файл, в который были сохранены данные при прошлом запуске.

    Исправляется сменой значения Copy To Output Folder для mdf-файла в проекте на If Newer.

licensed under cc by-sa 3.0 with attribution.