Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF数据服务和升级_C#_.net_Wcf Data Services - Fatal编程技术网

C# WCF数据服务和升级

C# WCF数据服务和升级,c#,.net,wcf-data-services,C#,.net,Wcf Data Services,我有一个名为Contract的实体的WCF数据服务 合同和报价之间存在多对多关系:(*)合同(*)报价 我有一个方法可以添加/删除合同和报价之间的链接 有时我会收到updateException,因为我试图在合同和报价之间添加链接,而链接已经存在 我想写一个只在链接不存在时添加链接的查询,而不需要查询数据库中我的合同和报价之间的现有链接 有没有一种使用表达式树的方法?还是林克 目前,我这样做: void ModifyContract(Contract ctr) { var contrac

我有一个名为Contract的实体的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();
}

对于Silverlight,我自己也问了一个类似的问题


您要么需要检查现有的关系(然后取决于您的效率),要么可以将UpsertQuote功能放入存储过程(例如sp_UpsertQuote(construcd,quoteId)并调用它,而不是使用SaveChanges().

如果您有SQL Server 2008R2,我建议您创建一个利用的SQL Server存储过程

如果您不这样做,那么我仍然会编写一个存储过程来upsert


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

当您说链接已经存在时,您的意思是它已经存在于数据库或内存中?如果您是指数据库,客户端无法知道哪些链接在dat中abase不查询数据库…难道不可能编写一个表达式树来完成服务器端的所有处理吗?我会打开Sql profiler并查看生成的查询。我认为它会在同一个连接上发出两个请求。难道不可能编写一个表达式树来完成服务器端的所有处理吗一边