【问题标题】:DbContext SaveChangesDbContext SaveChanges
【发布时间】:2015-03-30 19:17:56
【问题描述】:

我对 C# 比较陌生,对 WPF 也很陌生。我一直在尝试围绕 MVVM 的概念展开思考,现在我已经将 ADO Entity 加入其中。

我的示例应用程序的目的是跟踪 CAD 项目。我正在从数据库中提取项目并成功填充我的视图;伟大的。我已经手动添加了信息以测试视图是否正常工作。

我现在从我的应用程序尝试通过我从 ICommand 启动的功能添加新项目。据我了解,我正在创建一个新的 DBContext 对象,向其中添加一个项目并保存我的更改。成功执行“SaveChanges()”告诉我 1 行已更新,但当我检查时,数据不存在?除此之外,如果我再次调用 SaveChanges()(在同一个调试会话中),它会引发错误以指示有多个条目。同样,当通过“显示表数据”查看数据时,我什么也看不到。

    public void AddNewItem(object parameter)
    {
        using (var dbq = new DBEntities()) {
            var tempItem = dbq.OutstandingCAD.Create();
            tempItem.Id = 2;
            dbq.OutstandingCAD.Add(tempItem);
            dbq.SaveChanges();
        }

    }

有人可以查看那一小段代码并建议我所做的是否正确以及我的问题是否出在其他地方?

非常感谢

【问题讨论】:

  • 当您从数据库创建实体时,它是一个连接对象。所以调用Add 会尝试再次输入。因此错误。您可以删除 Add 行并保存。
  • 您使用的是什么数据库技术?完整的 SQL 服务器? SQL Express 实例?内置的 LocalDb?
  • @paqogomez 非常感谢,我不知道是这种情况;我已经删除了那条线。不幸的是,SaveChanges() 仍然没有插入我的对象。
  • @Claies 我创建了一个新的基于服务的数据库 (.mdf),它生成了一个 .edmx 文件。恐怕这就是我所知道的,所以我最好的选择是使用“LocalDb”

标签: c# wpf entity-framework


【解决方案1】:

您的问题不在于您的代码,而在于您尝试评估工作的方式。

有一篇 Microsoft 文章 here 讨论了您遇到的情况。它引用了 Visual Studio 2005,但仍然具有相关性。

基本上,您的数据库是存储在您的项目中的.mdf 文件。您的 SQL 连接字符串类似于 AttachDbFileName=|DataDirectory|\data.mdf"

使用本地数据库文件时要知道的一件事是它们被视为任何其他内容文件。对于桌面项目,这意味着默认情况下,每次构建项目时都会将数据库文件复制到输出文件夹(又名 bin)。 F5 之后,它在磁盘上的样子是这样的

MyProject\Data.mdf
MyProject\MyApp.vb
MyProject\Bin\Debug\Data.mdf
MyProject\Bin\Debug\MyApp.exe

在设计时,数据工具使用 MyProject\Data.mdf。在运行时,应用程序将使用输出文件夹下的数据库。由于复制,很多人的印象是应用程序没有将数据保存到数据库文件中。实际上,这仅仅是因为涉及到的数据文件有两个副本。通过数据库浏览器查看模式/数据时同样适用。这些工具使用的是项目中的副本,而不是 bin 文件夹中的那个。

基本上,您有 2 个数据库副本,一份用于设计时,一份用于运行时。您正在查看设计时数据库,但没有看到对运行时数据库所做的更改。但是,每次运行项目时,运行时数据库都会被覆盖,因此您的更改可能会消失。这确实是一个调试功能,可防止您在同一功能的多次测试中在数据库中保留数百行。但是,有些人更喜欢这种持久性,并且会使用外部 SQL 实例而不是包含 .mdf 的项目。

【讨论】:

  • Claies,我不知道这种行为是在闭门造车的。非常感谢您花时间回复并帮助我解决这个问题!
  • 如果这有助于您解决问题,请考虑投赞成票和/或接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多