3

我在 WPF 中使用 LINQ-TO-SQL 设置了一个非常简单的示例。

我可以像这样得到一个对象(pageItem),我可以更改属性,当我调用SubmitChanges () 时它没有给我任何错误,但它不会保存更改。

MainDataContext db = new MainDataContext();
var pageItem = (from p in db.PageItems
              where p.Id == 1
              select p).SingleOrDefault();

pageItem.Title = "changed";
db.SubmitChanges();

什么可能导致 SubmitChanges 不提交更改?

更多信息:

这也不起作用,即使 db.ExecuteCommand 也不起作用,而且奇怪的是在调试 F11 时没有进入 SubmitChanges() 或 ExecuteCommand(),为什么我不能进入这些?

using (var db = new MainDataContext())
{
    var pageItem = (from p in db.PageItems
                    where p.Id == 1
                    select p).SingleOrDefault();

    pageItem.Title = "changed";
    db.SubmitChanges();

    db.ExecuteCommand("INSERT INTO PageItems (Title) VALUES ('this is the title')");


    if (pageItem != null)
        MainContent.Children.Add(new QuickForm(pageItem));

}

更多信息:

db.Log = Console.Out 给了我这个:

SELECT [t0].[Id], [t0].[IdCode], [t0].[Title], [t0].[Description], [t0].[DisplayOrder]
FROM [dbo].[PageItems] AS [t0]
WHERE [t0].[Id] = @p0
'TestPageManager23434.vshost.exe' (Managed): Loaded 'C:\Windows\assembly\GAC_MSIL\PresentationFramework.resources\3.0.0.0_de_31bf3856ad364e35\PresentationFramework.resources.dll'
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

INSERT INTO PageItems (Title) VALUES ('this is the title')
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

The thread 0x1190 has exited with code 0 (0x0).

回答

解决方案有三方面:

  • 我正在更改与在 Visual Studio 中查看的不同的数据库,解决方案:

    var db = new MainDataContext(@"C:\Users\TestUser\Documents\Visual Studio 2008\Projects\TestPageManager23434\TestPageManager23434\Data\Main.mdf"))

  • 使更新工作但不是 SubmitChanges(),解决方案是设置主键。

  • 它仍然没有显示所有的 chagnes,问题是我打开了许多“显示数据”窗口,这些窗口没有被更新

4

4 回答 4

6

如果您没有在 SQL Server 中的表上定义主键,则可能会发生这种情况

于 2009-10-16T16:35:06.927 回答
2

您是否使用 SQL 表达式 mdf 文件?

一篇文章介绍了这可能如何导致您获得文件的副本而不是原始文件,从而导致您描述的症状。

自由贸易协定:

我认为项目系统或服务器资源管理器向导提供将您的 mdf“复制”到您的项目目录中。也许您正在操作数据库的副本并在服务器资源管理器中查看另一个。

于 2009-10-16T16:25:18.300 回答
2

由于某种原因,上下文可能不会跟踪更改。尝试将您db.Log连接到编写器并检查 LINQ->SQL 在您调用时正在做什么SubmitChanges()..

db.Log = Console.Out;

然后你可以观察你在调试中运行的输出窗口,看看发生了什么。

于 2009-10-16T16:26:57.843 回答
0

我遇到了同样的问题,我在项目中看到的数据库SubmitChanges中的记录没有被该方法修改。

经过这么多的试验和研究,我发现系统将另一个版本的数据库 Northwnd.mdf放在项目的根目录\Bin\Debug\Northwnd.mdf中。这就是完美地发生变化的地方。

于 2013-10-27T00:55:46.417 回答