LINQ to SQL仅支持单个工作单元,还是可以持久化Context并执行Next操作?

时间:2011-02-05 19:38:29

标签: linq-to-sql duplicates unit-of-work

我有一个Windows应用程序。我试图通过DataContext插入记录。它在表中有唯一标识符。即使我在插入后执行触发器。因此,我在触发器的末尾进行选择查询以获取自动生成器编号并避免自动同步错误。因为它是一个Windows应用程序,我可以长时间保持上下文。当我创建一个新对象(例如顺序)并执行相同的先前操作时,在SubmitChanges操作时,它显示不能有重复键。为什么我不能使用相同的Context来插入第二条记录?或者我是否需要创建一个新的Context来插入一个新记录?(这个工作单元概念是否来到这里?)。创建新上下文是个坏主意,因为我需要再次加载所有数据..

有什么想法吗?

一些代码示例来解释我的情况:

CallCenterLogObjCotext = (CallCenterLogObjCotext == null ? (new CallcenterLogContext) : (CallCenterLogObjCotext));

 CallDetail newCallDetailsOpenTicket = new CallDetail();

 newCallDetailsOpenTicket.CallPurpose = (from callpuposelist in CallCenterLogObjCotext.CallPurposes
   where callpuposelist.CallPurposeID == ((CallPurpose)(cbcallpurpose.SelectedItem)).CallPurposeID
   select callpuposelist).FirstOrDefault();

很多像这样的设置......

CallCenterLogObjCotext.CallDetails.InsertOnSubmit(newCallDetailsOpenTicket);
CallCenterLogObjCotext.SubmitChanges();

正如我上面提到的,这是在Windows窗体上点击Open Ticket按钮。我在该表单上的可用文本框中更改了fname,lname和all的值,然后单击了相同的按钮。 所以它会再次调用相同的方法。我得到以下指定的错误:

  

System.Data.Linq.DuplicateKeyException:无法添加具有已在使用的密钥的实体。

1 个答案:

答案 0 :(得分:1)

您可以使用相同的上下文对象插入多行,请参阅http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspxhttp://msdn.microsoft.com/en-us/library/bb425822.aspx和其他众多在线示例。重复密钥问题可能是linq to sql配置问题,或者是数据库完整性错误,例如,如果表上有一个自然主键,并且尝试多次插入具有相同自然主键的行。< / p>