RIA Domain服务有这种方法......
public virtual CmsDealer GetCmsDealer(string id)
{
return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id);
}
Wcf服务有这个......
public CmsDealer GetDealer(string id)
{
return domainservice.GetCmsDealer(id);
}
当使用不存在的Id调用时,GetCmsDealer()调用barfs,但有例外
无法将类型为'System.Object []'的对象强制转换为'RIAServicesLibrary.Web.Models.CmsDealer []'。
我的印象是它只会重新调整null,我可以稍后测试。但不知何故,这种情况并没有发生。我发现的所有例子都显示出这样的工作正常。
任何洞察力都有帮助,我对EF,RIA和Wcf有点困惑和一点点新闻。
更新:问题是我需要一直追踪失败到Wcf,以便最终调用GetDealer的应用程序可以发现没有解决方案。理想情况下,我需要这样做而不会留下未捕获的例外情况:)
GetCmsDealer中的try / catch解决方案将允许我检测失败,但是仍然没有办法重新检查“空”CmsDealer对象而不会伪造一些约束(看起来实体对它很挑剔)。
所以我也可以在GetDealer中尝试/ catch,但是我仍然没有有效的CmsDealer对象返回。
谢谢!
已更新
对于那些想知道它是如何发挥作用的人来说,最后的例程看起来像这样......
public virtual IQueryable<CmsDealer> GetCmsDealerSetOrEmpty(string id)
{
return this.Context.CmsDealerSet
.Include("CmsItemState")
.Where(p => p.Id == id)
;
}
Wcf包装器现在又回到了简单的传递过程。在客户端我检查结果的Count(),如果它是0然后我可以知道没有记录,如果它是1然后一个简单的First()得到我的记录。
我愿意打赌有更好的方法。
答案 0 :(得分:3)
您还可以修改域服务以进行选择,这样您就可以获得可以在WCF服务中测试的IEnumerable(如果我没有记错,则会有一个计数)。所以你要修改它是这样的: public virtual IEnumerable GetDealer(string id){ return this.Context.CmsDealerSet.Select(p =&gt; p.Id == id); }
然后在WCF服务中,您可以执行以下操作: public CmsDealer GetDealer(string id) { var x = domainservice.GetCmsDealer(id); if(x.Count()== 0) { //哎呀,这里没什么可看的 } else { //住在这里 } }
答案 1 :(得分:3)
这是Null Object Pattern的好机会。例如,它将Double.NaN视为默认值。
更改域服务功能如下
public virtual CmsDealer GetCmsDealer(string id)
{
return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id)??
CmsDealer.NullValue;
}
允许您在WCF服务中拥有有效值并对客户端执行检查
答案 2 :(得分:0)
如果找不到匹配的记录,FirstOrDefault将返回Null。我怀疑您的服务出现null返回问题。如果没有找到匹配项,我建议更改此项以抛出异常并在客户端捕获异常。
吉姆