LinqToSql пытается вставить дочерний ключ внешнего ключа, когда он уже существует в WCF. Что я могу сделать? - PullRequest
1 голос
/ 17 сентября 2009

У меня проблемы с вставкой нового объекта LinqToSql поверх WCF.

То, что я делаю, это просто отправка пакета заказов в сервис. Внутри партии находятся Заказы, которые уже были отправлены ранее. Когда я делаю

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 голосов
/ 18 сентября 2009

Ну, в принципе, для каждого заказа, который вы получаете через службу 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() в контексте, чтобы все эти изменения вставились!

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...