【问题标题】:Entity Framework won't persist data in SQL Express (MDF)实体框架不会在 SQL Express (MDF) 中保留数据
【发布时间】:2009-05-18 02:09:52
【问题描述】:

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

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

【问题讨论】:

  • 语法太差了...那么多感叹号...
  • 这是“非常糟糕的语法”,而不是“如此糟糕的语法”

标签: c# entity-framework persistence sql-server-express


【解决方案1】:

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


编辑:提供解决方案

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

请注意Copy if newer 存在一些风险when accesing a .mdf Database

【讨论】:

  • 这实际上不是问题。调试使用的数据库是 bin 目录中真实数据库的副本,然后在调试之后,运行时的所有更改都将丢失,因为每次构建时都会更新此临时数据库。在生产中它不会发生。
  • 是的,我终于明白了。这并不完全直观,但有时我头脑很清醒。
  • 救了我的命,伙计。我在这里发疯了,却没有意识到!
  • 那么有人有解决办法吗?如何更新原始数据库?
【解决方案2】:

我想到了一些事情:

  • 双/高-检查您的连接字符串;你真的在和你认为的文件说话吗?
  • 您是否在任何地方使用事务而不提交它们?
  • 您是否将 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();

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

【讨论】:

    【解决方案3】:

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

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

    当您按 F5 运行应用程序时,VS 会将所有文件包括数据库 MDF 文件复制到 bin 文件夹。对该数据库进行所有更改。当您关闭并重新启动应用程序时,原始数据库的新克隆被复制到 bin 文件夹中,覆盖那里的所有内容,因此似乎覆盖了您之前的更改。 How to: Manage Local Data Files in Your Project

    对此进行了介绍

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-02-29
        • 2014-10-28
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多