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.