WCF数据服务和Upserts

时间:2011-06-10 14:40:46

标签: c# .net wcf-data-services

我有一个名为Contract的实体的WCF数据服务。

合同和行情之间有多对多:(*)合约< ----> (*)引用

我有一种方法可以在合同和报价之间添加/删除链接。

有时我会收到updateException,因为当链接已经存在时,我正试图在Contract和Quote之间添加一个链接。

我想写一个只在链接不存在的情况下添加链接的查询,而不需要在数据库中查询我的合同和引号之间的现有链接。

有没有办法使用Expression Trees?还是Linq?

目前,我这样做:

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 个答案:

答案 0 :(得分:2)

我自己为Silverlight How to do a server-side Insert/Update (Upsert) from Silverlight RIA services

提出了类似的问题

您需要检查现有关系(然后只是降低效率),或者您可以将Upsert功能放入存储过程(例如sp_UpsertQuote(contractId,quoteId)并调用它使用SaveChanges()。

答案 1 :(得分:2)

如果您有SQL Server 2008 R2 ,那么我建议您创建一个使用 Merge 的SQL Server存储过程。

如果你不这样做,我仍然会写一个存储过程来upsert。

这样做的好处是,您无需向数据库发出多个请求,只需确定是否需要创建或更新。