0

RIA 域服务具有此方法...

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[]”类型。

我的印象是它只会返回一个空值,我可以稍后进行测试。然而不知何故,这并没有发生。我发现的所有示例都显示类似这样的工作正常。

任何有帮助的见解,我都对 EF、RIA 和 Wcf 感到有点困惑和新手。

更新:问题是我需要一直跟踪失败到 Wcf 以便最终调用 GetDealer 的应用程序可以发现没有解决方案。理想情况下,我需要这样做而不留下未捕获的异常:)

GetCmsDealer 中的 try/catch 解决方案将允许我检测到故障,但仍然无法在不伪造许多约束的情况下重新启动“空”CmsDealer 对象(似乎实体对此很挑剔)。

所以我也可以在 GetDealer 中尝试/捕获,但我仍然没有要返回的有效 CmsDealer 对象。

谢谢!

更新

对于那些想知道它是如何发挥作用的人来说,最后的程序看起来是这样的......

public virtual IQueryable<CmsDealer> GetCmsDealerSetOrEmpty(string id)
{
    return this.Context.CmsDealerSet
        .Include("CmsItemState")
        .Where(p => p.Id == id)
        ;
}

Wcf 包装器现在恢复为简单的传递。在客户端我检查结果的 Count(),如果它是 0,那么我可以知道没有记录,如果它是 1,那么一个简单的 First() 就会让我得到记录。

我愿意打赌有更好的方法。

4

3 回答 3

3

您还可以修改域服务以进行选择,这样您将获得一个 IEnumerable(如果我没记错的话,它有一个计数),您可以在 WCF 服务中进行测试。因此,您可以将其修改为: public virtual IEnumerable GetDealer(string id){ return this.Context.CmsDealerSet.Select(p => p.Id == id); }

然后在 WCF 服务中您可以执行以下操作: public CmsDealer GetDealer(string id) { var x = domainservice.GetCmsDealer(id); if(x.Count() == 0) { // 哎呀,这里没什么可看的 } else { // 在这里直播 } }

于 2009-08-26T19:48:30.283 回答
3

这是Null 对象模式的一个好机会。例如,将 Double.NaN 视为默认值。

更改域服务功能如下

public virtual CmsDealer GetCmsDealer(string id)
{
  return this.Context.CmsDealerSet.FirstOrDefault(p => p.Id == id)??
    CmsDealer.NullValue;
}

允许您在 WCF 服务中具有有效值并在客户端上执行检查

于 2009-08-27T02:37:58.980 回答
0

如果没有找到匹配的记录,FirstOrDefault 将返回 Null。我怀疑您的服务在返回 null 方面存在问题。如果找不到匹配项并在客户端上捕获异常,我建议更改此设置以引发异常。

吉姆

于 2009-08-26T16:51:48.283 回答