Очень загадочная проблема здесь.Содержимое таблицы MDF удаляется при запуске приложения из VS
Я МДФ- файл в проекте с одним столом (двойной щелчок покажет это):
CREATE TABLE [dbo].[Table] (
[Id] DATETIME NOT NULL,
[Version] NCHAR (20) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Затем добавить DBML (Linq к SQL), перетащить таблицу там, добавить код
partial class TestDataContext
{
public static string DatabaseFile { get; private set; }
public static string ConnectionString { get; private set; }
static TestDataContext()
{
DatabaseFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Test.mdf");
ConnectionString = string.Format(@"Data Source=(LocalDB)\v11.0;AttachDbFilename={0};Integrated Security=True", DatabaseFile);
}
public TestDataContext Attach()
{
Detach();
var context = new TestDataContext(ConnectionString);
// re-create database
if (!context.DatabaseExists() && !File.Exists(DatabaseFile))
context.CreateDatabase();
return context;
}
public static void Detach()
{
try
{
using (var master = new DataContext(@"Data Source=(LocalDB)\v11.0;Initial Catalog=master;Integrated Security=True"))
{
master.ExecuteCommand(string.Format(@"ALTER DATABASE [{0}] SET OFFLINE WITH ROLLBACK IMMEDIATE", DatabaseFile));
master.ExecuteCommand(string.Format(@"exec sp_detach_db '{0}'", DatabaseFile));
}
}
catch { } // should be safe
}
public void Test()
{
var row = new Table() { Id = DateTime.Now, Version = "test1.0" };
Tables.InsertOnSubmit(row);
System.Threading.Thread.Sleep(5);
row = new Table() { Id = DateTime.Now, Version = "test1.1" };
Tables.InsertOnSubmit(row);
SubmitChanges();
}
}
Это необходимо для отсоединения базы данных и воссоздания базы данных, если файл удален (возможно, это связано с проблемой, см. Далее). Это новая база данных создается около exe-файла (не смешивайте его с одним в проекте, используемым только для определения структуры и генерации dmbl).
Теперь проблема: когда я запускаю приложение из VS (F5), то эта таблица всегда пустой. Даже до звонка Attach()
его содержимое из предыдущего запуска стирается! Похоже, если VS откроет новый mdf-файл, найдите мой стол там (lol) и очистите его!
Самая запутанная часть: если скомпилированный exe-файл работает напрямую, то контент сохраняется между запусками (по назначению). Как только я ударил F5 в VS, он снова станет пустым.
Любая идея?
открываю что новый мдф-файл в VS «Database Explorer», чтобы быть в состоянии увидеть, что происходит. Приложение добавляет несколько строк, вызывая Test()
, и я вижу это в приложении и в проводнике. Затем приложение завершает работу. Данные по-прежнему. Да, я нажимаю кнопку обновления, это все равно. Затем я ударил F5 и до нажатия кнопки, вызывающей Attach()
. Перейдите в проводник и нажмите «Обновить» там. Таблица пуста.
Корпус, спасибо! (предыдущий комментарий был моей ошибкой, так как у меня было открыто 2 проекта: оригинал и тест, для отправки здесь, проверено неправильно). – Sinatr