【发布时间】:2014-09-19 10:40:06
【问题描述】:
这里有一个非常神秘的问题。
我的项目中有单表的 mdf 文件(双击会显示这个):
CREATE TABLE [dbo].[Table] (
[Id] DATETIME NOT NULL,
[Version] NCHAR (20) NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
然后我添加dbml(Linq-to-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();
}
}
如果文件被删除,则需要分离数据库并重新创建数据库(可能与问题有关,请参阅更多内容)。 new 数据库是在 exe 文件附近创建的(不要与项目中的一个混合,仅用于定义结构和生成 dmbl)。
现在的问题是:当我在 VS (F5) 中运行应用程序时,该表总是空白。即使在调用Attach() 之前,它之前运行的内容也会被删除!看起来如果 VS 打开 new mdf 文件,在那里找到我的表(大声笑)并清除它!
最令人困惑的部分:如果编译后的 exe 文件直接运行,那么内容会在启动之间持续存在(如预期的那样)。一旦我在 VS 中按下 F5 .. 它就会再次变为空。
有什么想法吗?
我在 VS“数据库资源管理器”中打开那个 new mdf 文件,以便能够看到发生了什么。应用程序通过调用Test() 添加了一些行,我在应用程序和资源管理器中看到了这一点。然后应用程序退出。数据还在。是的,我单击刷新按钮,它仍然是。然后我点击 F5 并在按下调用 Attach() 的按钮之前切换到资源管理器并点击刷新.. 表是空的。
【问题讨论】:
标签: c# sql visual-studio-2013 mdf