Службы данных WCF и Upserts - PullRequest
4 голосов
/ 10 июня 2011

У меня есть Служба данных WCF с лицом по имени Контракт.

Между Контрактами и Котировками есть много-много: (*) Контракт <----> (*) Котировки

У меня есть метод, который добавляет / удаляет ссылки между контрактами и кавычками.

и иногда я получаю исключение updateException, потому что я пытаюсь добавить ссылку между Контрактом и Цитатой, когда ссылка уже существует.

Я хочу написать запрос, который добавляет ссылку, только если ссылка еще не существует, без необходимости запрашивать в базе данных существующие ссылки между моим контрактом и кавычками.

Есть ли способ сделать это с помощью деревьев выражений? или Линк?

На данный момент я делаю это:

void ModifyContract(Contract ctr)
{
    var contractInDb = (from c in service.Contracts.Expand("Quotes")
                       where c.Id == ctr.Id).Single();

    foreach(q in ctr.Quotes)
    {
        if( ! contractInDb.Quotes.Contains(q))
         {
              service.AddLink(ctr,"Quotes", q);
         }
    }

    service.SaveChanges();
}

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Если у вас SQL Server 2008 R2 , я бы порекомендовал вам создать хранимую процедуру SQL-сервера, которая использует Слияние .

Если нет, я все равно написал бы хранимую процедуру для подтверждения.

Преимущество этого заключается в том, что вам не нужно делать несколько запросов к базе данных, просто чтобы выяснить, нужно ли вам создавать или обновлять.

2 голосов
/ 24 июня 2011

Я сам задавал аналогичный вопрос для Silverlight Как выполнить вставку / обновление на стороне сервера из служб Silverlight RIA

Вам нужно либо проверить наличие существующей связи (тогда это зависит только от того, насколько эффективно вы можете это сделать), либо вы можете поместить свою функцию Upsert в хранимую процедуру (например, sp_UpsertQuote (contractId, quoteId) и вызвать ее вместо этого использования SaveChanges ().

...