【问题标题】:OData client unable to send null values for Key propertiesOData 客户端无法为键属性发送空值
【发布时间】: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>

我觉得我在这里遗漏了一些东西,也许我应该保持原样,但如果不是,我可以采取哪些步骤来确保他们可以正确调用我的服务

【问题讨论】:

    标签: c# odata


    【解决方案1】:
    1. Id 属性定义为可为空并删除其上的KeyAttribute

      public class ContactDTO
      {
          public int? Id { get; set; }    
      
          [ForeignKey("Person")]
          public int? PersonId { get; set; }
      } 
      
    2. Id 属性配置为键和可选:

      ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
      
      modelBuilder.EntityType<ContactDTO>().HasKey(_ => _.Id);
      
      modelBuilder.EntityType<ContactDTO>().Property(_ => _.Id).IsOptional();
      

    它产生以下元数据:

    <EntityType Name="ContactDTO">
        <Key>
            <PropertyRef Name="Id" />
        </Key>
        <Property Name="Id" Type="Edm.Int32" />
        <Property Name="PersonId" Type="Edm.Int32" />
    </EntityType>
    

    【讨论】:

    • 是的,做到了。我尝试了一些使属性为 Nullable 和添加/删除 Key 属性的组合,但没有考虑通过 ModelBuilder 指定它。谢谢!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多