从WCF DataService客户端获取单个记录的最佳实践

3

我有一个DataService,其中T是EntityFramework DbContext类。

我的客户端应用程序是一个带有服务引用的Windows Forms应用程序。

获取单个实体的最佳方法是什么?

这段代码有效:

var uri = new Uri("http://localhost/ProductService.svc/");
var context = new ProductContext(uri);
var result = context.Products.Where(x => x.ProductId == 123).FirstOrDefault();

然而,它能够运行是因为产品存在。这是因为我可以通过执行来看到结果。
http://localhost/ProductService.svc/Products(123)

在浏览器中。如果我想查询数据库中不存在的产品123456。
http://localhost/ProductService.svc/Products(123456)

我看到了一个错误消息:资源未找到,对应的段是“Products”。

问题在于,客户端出现了异常,但我本来期望 FirstOrDefault() 返回 null。当然,我可以使用一些异常处理,但我想知道我的方法是否正确或者是否有更好的方式来获取单个对象。


作为建议,使用带有dbContextusing块,因为它实现了IDisposable接口。 - Brad M
1
@Brad M - 我在客户端 - ProductContext 是一个不可释放的 System.Data.Services.Client.DataServiceContext - Jürgen Steinblock
顺便提一下,FirstOrDefault() 不一定返回 null,它返回给定类型的默认值(例如日期的 DateTime.Minvalue)。 - Aether McLoud
是的,我知道 default(T),但我期望一个对象类型。 - Jürgen Steinblock
1个回答

3
更新:在这里找到了解决方案https://dev59.com/tXRB5IYBdhLWcg3wz6QK#5987733 关键是要设置

context.IgnoreResourceNotFoundException = true;

SingleOrDefault()FirstOrDefault()现在的表现是我所期望的。但我仍然在思考这是否是正确的决定,因为在浏览器中

 http://localhost/ProductService.svc/Prodducts(1)

(注意这里有一个拼写错误)抛出相同的ResourceNotFound异常


这种行为是遵循HTTP规范的。请求不存在的内容(无论是实体集名称错误还是不存在的键值)应该返回404。如果您对现有资源提出错误的问题(例如$filter中有错误),则会返回400。在HTTP中,404有点像null(不存在)。 - Vitek Karas MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接