好的,我正在做的事情(我认为)相当简单。
我设置了LINQ-to-SQL数据上下文,其中一个表是Users。在设计器中,它将类显示为“User”,源为“dbo.Users”。它的访问权限是公共的,我可以访问数据库来检索和更新就好了。该类设置为“使用运行时”进行I / D / U操作。
当我尝试添加新记录时出现问题。
当我在数据上下文中添加记录(SubmitChanges())时,没有任何反应。它根本不做插入。我已经在一个断点处检查了本地对象,并且所有迹象表明它确实在那里并且它确实具有应该添加的正确记录。
但等等,还有更多。
如果我执行Users.InsertOnSubmit()并传递datagrid的CurrentItem(转换为用户),它会给我一个错误,说“无法添加已经存在的实体”但是我发现该记录实际上已被插入。
有没有人有线索?
(FWIW,后端是SQL2K8 Express)
编辑:
代码没有异常但不添加记录:
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 :(得分:1)
问题是您使用的是与datagrid相同的数据上下文。不要那样做。为每个小任务创建新的数据上下文。它们比在长时间使用相同的上下文时积累的变化跟踪便宜得多,便宜得多。
答案 1 :(得分:0)
数据库中是否有任何AutoGenerated列(主键等)?
我在过去发现LINQ,如果这些不是Ints,并且在模型上没有标记为AutoGenerated,那么你会遇到这样的错误:
在“第2部分:在Linq DataContexts中填充隐藏列/自动生成的ID”中,我将讨论与同样的错误消息和行为有关的问题。
编辑以回复评论:
该行中主键字段的值是多少?我猜它默认为“0”,这已经存在于数据库中:
ctx.Users.InsertOnSubmit((User) e.Row.Item);
您是否尝试过检查是否正在编辑现有行,如果没有,请创建一个新的User对象,在其中填入字段,然后将其添加到Contexts InsertOnSubmit中?
Brad Abrams在他的SilverLight 3 RTM and .NET RIA Services July Update series的WinForms部分做了类似的事情 - 他还展示了在Silverlight中使用Master-Detail视图进行此类操作的其他方法。