11

我正在使用实体框架开发应用程序并将数据存储在 .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 数据库的内容时,那里什么都没有。

可能这是非常简单的事情,但我看不出它是什么,我需要你的帮助。

4

4 回答 4

15

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


编辑:提供解决方案

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

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

于 2009-05-19T21:06:57.520 回答
4

有几件事浮现在脑海:

  • 双/高音检查您的连接字符串;你真的在和你认为的文件说话吗?
  • 您是否在任何地方使用事务而不提交它们?
  • 您是否将 mdf 文件设置为“始终复制”(或其他任何内容)....即,您是否在每次点击构建/播放时不断覆盖 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);
}
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();

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

于 2009-05-18T06:09:38.880 回答
1

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

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

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

于 2012-10-19T15:06:41.633 回答
0

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

于 2009-05-18T07:46:46.537 回答