使用可空引用类型时,OData 元数据不生成可空方面

Posted

技术标签:

【中文标题】使用可空引用类型时,OData 元数据不生成可空方面【英文标题】:OData metadata not generating Nullable facet when using nullable reference types 【发布时间】:2021-05-04 03:22:00 【问题描述】:

我有一个简单的 C# 数据模型,我将它与 Entity Framework Core 和 OData 一起使用,它是使用 Nullable 引用类型“启用”构建的。

 public record Country

    [Key]
    [DisplayName("ISO Code")]
    [MaxLength(2)]
    [MinLength(2)]
    public string ISOCode  get; init;  = string.Empty;

    public string Name  get; init;  = string.Empty;

在构建 EF Core 和 SQL 数据库时,会创建属性 Name NOT NULL:

CREATE TABLE [dbo].[Country] (
[ISOCode] NVARCHAR (2)   NOT NULL,
[Name]    NVARCHAR (MAX) NOT NULL,
CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED ([ISOCode] ASC));

但是,当我构建 OData 端点时,没有 NULLABLE 方面:

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
    <edmx:DataServices>
        <Schema Namespace="DiveShopService.Models" xmlns="http://docs.oasis-open.org/odata/ns/edm">
            <EntityType Name="Country">
                <Key>
                    <PropertyRef Name="ISOCode" />
                </Key>
                <Property Name="ISOCode" Type="Edm.String" Nullable="false" MaxLength="2" />
                <Property Name="Name" Type="Edm.String" />
            </EntityType>
        </Schema>
        <Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
            <EntityContainer Name="Container">
                <EntitySet Name="Countries" EntityType="DiveShopService.Models.Country" />
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

应该是 Nullable="false" />

是否有一些配置选项可以使 OData 理解可空引用类型?

Visual Studio 16.8.4 Microsoft.EntityFrameworkCore v5.0.2 Microsoft.AspNetCore.OData v8.0.0-preview3 .NET 5.0

【问题讨论】:

映射引用类型为可为空是为 odata 设计的。您可以在构建模型时在属性上调用“IsRequired()” fluent API 以使属性不可为空。 【参考方案1】:

在为这种简单类型构建模型时,我对 EF Core 和 OData 之间的差异进行了一些调查。

为了清楚起见,请注意:问题更准确地在于 NonNullable 引用(和导航)类型。

事实证明,OData EDM 构建器没有明确处理这种情况,正如 Sam 评论的那样,这是“按设计”。如果要在 EF 和 OData 之间共享公共源模型,则应使用 [Required] 属性。或者使用 fluent API 修改模型。

更新:在Microsoft.OData.ModelBuilder中修复

【讨论】:

以上是关于使用可空引用类型时,OData 元数据不生成可空方面的主要内容,如果未能解决你的问题,请参考以下文章

想要启用可空引用类型时如何处理可选参数?

OData 带更新的实例,并能取得元数据格式类型

可空类型产生警告,因为项目已启用可空引用类型

可空引用类型 - 通过接受的参数返回类型可空性

将可空引用类型转换为不可空引用类型,不那么冗长

C# 8中的可空引用类型