我已经按照此处的教程创建了许多只读 Web Api OData 服务:http ://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api 。因此,我使用 ODataConventionModel 构建器从一组实体(顺便说一下来自 Telerik ORM)创建模型。这一切似乎都运行良好,我可以愉快地在服务上发出查询、查看元数据等。
我现在试图将注意力转移到其他 CRUD 操作上——首先是 Create 并偶然发现了一个问题!即,Post 方法正确触发(CreateEntity)但实体参数为空 - 通过对 ModelState.IsValid 进行检查,它表明问题是空 ID(键)值。这并不奇怪,因为数据库使用数据库生成的标识作为 ID 列,因此当实体保存到数据库上下文时会创建 ID。
因此,我尝试了各种将 ID 列标记为数据库生成的方法,但没有找到任何东西。奇怪的是,我似乎找不到任何人要求这个的帖子——当然我不能是唯一的一个?!
我注意到,在查看 EF 模型构建器时(例如这里:http ://forums.asp.net/t/1848984.aspx/1 )似乎有一种方法可以影响具有 .HasDatabaseGeneratedOption 属性的模型构建器,但是System.Web.Http.OData 等效项中不存在类似的选项。
因此,问题是:
- 有没有办法改变模型构建器(或其他东西),以便控制器接受对象并反序列化实体,即使键值为空?
- 如果是这样,我该怎么做?
- 如果没有,对其他选项有什么建议吗?
我意识到我可能只是用来自客户端请求的(在这种情况下)整数值填充对象,但这似乎 a)在语义上是错误的,并且 b)由于客户端工具包可能会导致不一定总是可能的使用。
感谢所有帮助!
非常感谢,
J。