我在通过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
我已经尝试将父级首先附加到上下文中,但它自然告诉我当我尝试将其插入后立即存在。附加子订单似乎也没有帮助。
有什么建议吗?
答案 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()
来进行所有这些更改并插入操作!
马克