我有一个名为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();
}
答案 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。
这样做的好处是,您无需向数据库发出多个请求,只需确定是否需要创建或更新。