2009-07-23 63 views
1

好的,我正在做的是(我认为)相当简单。不能从WPF Datagrid通过LINQ到SQL插入新记录

我有一个LINQ到SQL数据上下文设置,其中一个表是用户。在设计器中,它将该类显示为“用户”,源为“dbo.Users”。它的访问权限是Public,我可以访问数据库来检索和更新。该类设置为“使用运行系统”用于I/D/U操作。

问题出现在我尝试添加新记录时。

  1. 我有数据网格设置为的AutoGenerateColumns =“真”
  2. CanUserAddRows被设置为“真”
  3. RowEditEnding事件设置为一个方法。

当我在数据上下文中添加记录(SubmitChanges())时,没有任何反应。它根本不会插入。我已经在断点处检查了局部对象,并且所有迹象表明它确实存在,它确实有它应该添加的正确记录。

但是等等,还有更多。

如果我执行Users.InsertOnSubmit()并传递数据网格的CurrentItem(铸造给用户),它给了我一个错误,说“无法添加已存在的实体”,但我发现该记录实际上已被插入。

有没有人有线索?

(FWIW,后端是SQL2K8快递)

编辑:
给出也不例外,但不添加记录的代码之一:

  private void UserGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     ctx.SubmitChanges(); 
    } 

,并且给出了一个异常的代码:

 private void UserGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) 
    { 
     ctx.Users.InsertOnSubmit((User) e.Row.Item); 
     ctx.SubmitChanges(); 
    }  
+0

您是否能够显示与“不工作”行为相关的任何代码以及引发“实体已存在”错误的代码? – 2009-07-23 16:21:07

回答

1

问题是,您正在使用与datagrid相同的数据上下文。不要这样做。为每个小任务创建一个新的数据上下文。它们很便宜,比在长时间使用相同环境时累积的更改跟踪便宜得多。

0

在数据库(主键等)中是否有任何AutoGenerated列?

我与LINQ过去发现,如果这些都不是个整数,而不是被标记为自动生成的模型,你会得到那种错误的:

Playing with LINQ For SQL in Windows Form Application

在“第2部分:在Linq DataContexts中填充隐藏的列/自动生成的Ids”我讨论了同样的错误消息和行为的问题。


编辑回应评论:

什么是主键字段的该行中的价值?我猜测,它默认为“0”,这将在数据库中已经存在:

ctx.Users.InsertOnSubmit((User) e.Row.Item); 

您是否尝试过检查,看看你正在编辑现有的行,如果没有,创建一个新用户对象,mapp中的字段,然后将其添加到上下文InsertOnSubmit?

Brad Abrams在他的SilverLight 3 RTM and .NET RIA Services July Update series的WinForms部分中做了类似的事情 - 他还展示了在Silverlight中使用Master-Detail视图执行此类事情的其他方法。

+0

PK是自动生成的,但它是一个int,模型也将其显示为自动生成。 – 2009-07-23 16:48:54