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 us = e.User.Where(x => x.ID < 50).ToList(); foreach (User u in us) Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome); Console.ReadKey(); } 

当我运行这个时,我得到50个输出,如果我在调试中查看c变量的内容,有50个更改,每个事情似乎都没问题,但是当我启动查询浏览器并查看我的MDF数据库的内容时,那里什么都没有。

可能它很简单,但我看不出它是什么,我需要你的帮助。

我刚刚发现了什么问题,我猜其实并没有错。 我强制一个错误,然后我可以看到我访问的数据库是在bin目录中,每当我运行应用程序时,Visual Studio都会将我的数据库复制到bin目录,这就是为什么如果我手动添加一些数据我可以看到它,但运行时中的保存不会保留。 我一直在服务器上使用数据库,这是我第一次使用本地数据库,所以我把它搞砸了,但非常感谢你的帮助!


编辑:提供解决方案

如果要在构建时禁用复制数据库,则必须从解决方案资源管理器中访问.mdf文件中的“ Copy to Output Directoy ”。
只需将其更改为Copy if newerDo not copy

请注意, Copy if newer 在访问.mdf数据库时存在一些风险。

有些事情会浮现在脑海中:

  • double / treble-检查你的连接字符串; 你真的和你认为你的文件说话了吗?
  • 你在任何地方使用交易而不是提交它们吗?
  • 你有没有将mdf文件设置为“始终复制”(或者不管它是什么)….也就是说,每当你点击构建/播放时你是否经常覆盖mdf?

另外 – 在这种情况下我认为不重要,但要validation数据,您应该使用不同的实体/数据上下文:

 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 us = e.User.Where(x => x.ID < 50).ToList(); foreach (User u in us) Console.WriteLine("ID: " + u.ID + " Hello from " + u.Nome); } Console.ReadKey(); 

就像我说的 – 我怀疑它在这里很重要,但值得检查……

由于使用Visual Studio Server Explorer将MDF数据库文件附加到LocalDB的方式,可能会出现这种情况。

附加MDF文件时,VS会询问您是否要在项目中创建数据库的副本。 如果您说“否”,则在配置文件中生成一个连接字符串,其中包含一个“attachdbfilename”条目,该条目指向磁盘上MDF文件的绝对路径(例如“C:\ …”)。 但是,如果您说“是”,则它会复制MDF文件,将其添加到项目中,并且生成的连接字符串中的“attachdbfilename”条目将变为相对于| DataDirectory |。

当您按F5运行应用程序时,VS会将包括数据库MDF文件在内的所有文件复制到bin文件夹。 对该数据库进行所有更改。 当您关闭并重新启动应用程序时,原始数据库的新克隆将复制到bin文件夹,覆盖那里的所有内容,因此似乎会覆盖以前的更改。 “ 如何:管理项目中的本地数据文件”中对此进行了介绍

ID的类型是什么? 一个GUID? 你如何设置ID? 使用NewID()作为默认值? 如果是这种情况,则O / R映射器无法读回ID,并且可能会将实体标记为错误保存。 如果在db上执行任何查询,还要检查SQL事件探查器。