Entity Framework не будет сохранять данные в SQL Express (MDF)

Я разрабатывал приложение с использованием Entity Framework и сохранял данные в базе данных .mdf. Мой код может читать данные, по-видимому, он может также сэкономить, но только по-видимому. Он не получает эррос, а программа работает, как будто данные были сохранены, я могу, например, сохранить объект, удалить контекст, создать новый, а затем, когда я ищу свой объект там! Но когда я запрашиваю базу данных, чтобы увидеть сохраненные данные, там ничего нет. Если я закрою приложение и запустил его снова, все данные исчезнут. Вот пример кода, который я написал только для проверки:

        using (DatabaseEntities e = new DatabaseEntities())
        {
            for (int i = 0; i < 50; i++)
            {
                User u = new User();
                u.Nome = "User" + i.ToString();
                e.AddToUser(u);
            }
            int c = e.SaveChanges(true);

            List<User> us = e.User.Where<User>(x => x.ID < 50).ToList<User>();

            foreach (User u in us)
                Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome);

            Console.ReadKey();
        }

Когда я запускаю это, я получаю 50 выходов, если я смотрю содержимое переменной c в отладке, там 50 изменений, все кажется прекрасным, но когда я запускаю свой браузер запросов и просматриваю содержимое своего MDF, там ничего нет.

Возможно, это что-то очень простое, но я не вижу, что это такое, мне нужна ваша помощь.

Ответ 1

Я только что нашел, что пошло не так, и я думаю, что на самом деле ничего плохого. Я заставил ошибку, и тогда я мог видеть, что база данных, к которой я обращалась, была в каталоге bin, Visual Studio копировала мою базу данных в каталог bin каждый раз, когда я запускаю приложение, поэтому, если я добавлю некоторые данные вручную, я мог бы видеть это, но сохранение во время выполнения не сохраняется. Я всегда работал с базой данных на серверах, это мой первый раз с локальными базами данных, поэтому я испортил это, но большое спасибо за помощь!


Изменить: предоставление решения

Если вы хотите отключить копирование базы данных при сборке, вы должны получить доступ к Copy to Output Directoy из файла .mdf из своего обозревателя решений.
Просто измените его на Copy if newer или Do not copy.

Помните, что Copy if newer содержит некоторые риски при доступе к базе данных .mdf.

Ответ 2

Несколько вещей бросаются в глаза:

  • двойная/тройная проверка вашей строки подключения; вы действительно разговариваете с файлом, который, по вашему мнению, есть?
  • Вы используете транзакции где-нибудь и не совершаете их?
  • У вас есть файл mdf, установленный в "Copy Always" (или что-то еще)... т.е. вы постоянно переписываете mdf всякий раз, когда вы нажимаете build/play?

Кроме того - я не думаю, что это будет иметь значение в этом случае, но для проверки данных вы должны использовать разные сущности/контекст данных:

using (DatabaseEntities e = new DatabaseEntities()) {
    for (int i = 0; i < 50; i++) {
        User u = new User();
        u.Nome = "User" + i.ToString();
        e.AddToUser(u);
    }
    int c = e.SaveChanges(true);
}
using (DatabaseEntities e = new DatabaseEntities()) {
    List<User> us = e.User.Where<User>(x => x.ID < 50).ToList<User>();
    foreach (User u in us)
        Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome);
}
Console.ReadKey();

Как я уже сказал - я сомневаюсь, что это будет иметь значение здесь, но стоит проверить...

Ответ 3

Эта ситуация может возникнуть из-за того, как вы прикрепляете файл базы данных MDF к LocalDB с помощью Visual Studio Server Explorer.

Когда вы присоединяете MDF файл, VS спрашивает, хотите ли вы создать копию базы данных в своем проекте. Если вы скажете "Нет", в файле конфигурации генерируется строка соединения, которая включает в себя запись "attachdbfilename", которая указывает на абсолютный путь к файлу MDF на диске (например, "C: \..." ). Однако, если вы произнесете "Да", то он сделает копию файла MDF, добавит его в проект, а запись "attachdbfilename" в сгенерированной строке соединения станет относительно | DataDirectory |.

Когда вы нажимаете F5 для запуска приложения, VS копирует все файлы , включая файл MDF базы данных в папку bin. Все изменения внесены в эту базу данных. Когда вы закрываете и перезапускаете приложение, новый клон исходной базы данных копируется в папку bin, перезаписывая все, что было там, поэтому появляется, чтобы перезаписать ваши предыдущие изменения. Это описано в Как управлять локальными файлами данных в вашем проекте

Ответ 4

Какой тип идентификатора? GUID? Как установить идентификатор? С NewID() по умолчанию? Если в этом случае устройство отображения O/R не может прочитать идентификатор обратно и, скорее всего, будет помечать объект как ошибочно сохраненный. Также проверьте с помощью SQL Profiler, если вы получите какие-либо запросы, выполненные в db.