LinqToSql尝试在WCF上已存在时插入外键子项。我能做什么?

时间:2009-09-17 18:52:55

标签: .net wcf linq-to-sql foreign-keys

我在通过WCF插入新的LinqToSql对象时遇到问题。

我正在做的只是向服务发送订单批量。批次内部是先前已发送的订单。当我做的时候

data.batches.InsertOnSubmit(newbatch)

我收到一个SQL错误:

"Violation of PRIMARY KEY constraint 'PK_HTOrder'. Cannot insert duplicate key in object 'dbo.HTOrder'. The statement has been terminated."

以下是插入批处理(obj)的代码:

Dim tableproperty As PropertyInfo = dataProperties.Find(Function(p As PropertyInfo) (p.PropertyType.FullName.Contains("[" + obj.GetType.FullName + ",")))
Dim tableMethod As MethodInfo = tableproperty.GetGetMethod()
Dim tab As Object = tableMethod.Invoke(data, New Object() {})

tab.GetType.GetMethod("InsertOnSubmit", New Type() {obj.GetType}).Invoke(tab, New Object() {obj})
data.SubmitChanges(ConflictMode.FailOnFirstConflict)

Dim checkMatch As Object = GetMatchingEntities(obj, data).SingleOrDefault
If checkMatch Is Nothing Then Throw New UpdateNotVerfiedExecption(obj)
Return checkMatch

我已经尝试将父级首先附加到上下文中,但它自然告诉我当我尝试将其插入后立即存在。附加子订单似乎也没有帮助。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

嗯,基本上,对于您在批次中通过WCF服务收到的每个订单,您必须先检查它是否已经存在。如果是,则不应在其上调用InsertOnSubmit - 因为它已经在数据库中。如果其中的元素已经存在于数据库中,则不能只插入整个批处理。

类似的东西:

foreach(Order order in newbatch)
{
   if(data.Orders.Any(o => o.OrderID = order.ID))
   {
     // order already exists - update it
     data.Orders.Attach(order);
   }
   else
   { 
     // order does not exist already --> insert it
     data.Orders.InsertOnSubmit(order);
   }
}

当订单是新订单且尚不存在时 - >使用InsertOnSubmit插入。如果它已经存在,请将其重新附加到数据上下文,从而为Linq-To-SQL提供更改以进行更改跟踪并更新该行。

在所有这些之后,当然,您需要在上下文中调用SubmitChanges()来进行所有这些更改并插入操作!

马克