【发布时间】:2016-12-22 18:34:47
【问题描述】:
我构建了一个 OData WebAPI 服务,公开了几个实体(使用 OData 4,System.Web.Odata v5.1.9)。
该服务接受 bost POST(用于创建)和 PATCH(用于更新)。在内部,POST 和 PATCH 都被转发到 Oracle 数据库,并且这两种方法都通过将 Id 作为输入参数的单个存储过程进行处理。如果 Id 为 null,则创建一条新记录,否则更新具有该 Id 的记录。
最近我们的一位消费者抱怨他们无法正确插入新数据。问题是他们使用 OData 客户端使用元数据生成他们的模型。由于 Id 不可为空,因此总是将 0 发送到我的服务,提示数据库例程使用 Id 0 更新记录(不存在,引发异常)。
现在,我看到有几个选项可以规避这个问题:
- 在我的控制器中检查 Id 是否为默认值(int),如果是,则将 NULL 传递给 SP
- 停止使用 OData 客户端,让他们手动构建消息
- 将单个存储过程分成两个过程(插入和更新)
- 将 Id 属性更改为字符串
我的实体类如下所示:
public class ContactDTO
{
[Key]
public int Id { get; set; }
[ForeignKey("Person")]
public int? PersonId { get; set; }
// snip some other properties
}
因为 Id 属性被定义为 [Key],它在元数据中显示为必需:
<EntityType Name="ContactDTO">
<Key>
<PropertyRef Name="Id"/>
</Key>
<Property Name="Id" Type="Edm.Int32" Nullable="false"/>
<Property Name="PersonId" Type="Edm.Int32"/>
</EntityType>
我觉得我在这里遗漏了一些东西,也许我应该保持原样,但如果不是,我可以采取哪些步骤来确保他们可以正确调用我的服务
【问题讨论】: