2015-03-30 54 views
1

我对C#比较陌生,对WPF也很新颖。我一直试图围绕MVVM的概念进行研究,现在我已经将ADO实体引入混合。DbContext SaveChanges

我的示例应用程序的目的是跟踪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(); 
     } 

    } 

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

非常感谢

+0

当您从数据库创建一个实体时,它将一个连接的对象。所以调用'Add'会尝试重新放入。因此错误。您可以删除“添加”行并保存。 – paqogomez 2015-03-30 19:22:52

+0

您使用的是哪种数据库技术?一个完整的SQL服务器?一个SQL Express实例?内置的LocalDb? – Claies 2015-03-30 19:23:25

+0

@paqogomez非常感谢,我不知道这是这种情况;我已经删除了该行。不幸的是,SaveChanges()仍然没有插入我的对象。 – 2015-03-30 19:30:05

回答

0

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

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

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

使用本地数据库文件时需要了解的一点是,它们被视为任何其他内容文件。对于桌面项目,这意味着默认情况下,每次构建项目时,数据库文件都将被复制到输出文件夹(aka 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的项目。

+0

Claies,我不知道这种行为是在闭门造车的。非常感谢您花时间回复并帮助我完成分类! – 2015-03-30 21:03:14

+0

如果这有助于您解决问题,请考虑投票和/或接受答案。 – Claies 2015-03-30 21:38:57