使用可为空的引用类型时,OData 元数据不生成可为空的方面
OData metadata not generating Nullable facet when using nullable reference types
我有一个简单的 C# 数据模型,我正在使用 Entity Framework Core 和 OData,它是使用可空引用类型“启用”构建的。
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 数据库时,会创建 属性 名称 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>
应该是 <属性 Name="Name" Type="Edm.String" Nullable="false" />
是否有一些配置选项可以使 OData 理解可为空的引用类型?
Visual Studio 16.8.4
Microsoft.EntityFrameworkCore v5.0.2
Microsoft.AspNetCore.OData v8.0.0-preview3
.NET 5.0
在为这种简单类型构建模型时,我调查了 EF Core 和 OData 之间的差异。
为清楚起见请注意:问题更确切地说是 NonNullable 引用(和导航)类型。
事实证明,OData EDM 构建器并未明确处理这种情况,正如 Sam 评论的那样,这是“按设计”。如果要在 EF 和 OData 之间共享公共源模型,则应使用 [Required] 属性。或者使用 fluent API.
修改模型
中修复
我有一个简单的 C# 数据模型,我正在使用 Entity Framework Core 和 OData,它是使用可空引用类型“启用”构建的。
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 数据库时,会创建 属性 名称 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>
应该是 <属性 Name="Name" Type="Edm.String" Nullable="false" />
是否有一些配置选项可以使 OData 理解可为空的引用类型?
Visual Studio 16.8.4 Microsoft.EntityFrameworkCore v5.0.2 Microsoft.AspNetCore.OData v8.0.0-preview3 .NET 5.0
在为这种简单类型构建模型时,我调查了 EF Core 和 OData 之间的差异。
为清楚起见请注意:问题更确切地说是 NonNullable 引用(和导航)类型。
事实证明,OData EDM 构建器并未明确处理这种情况,正如 Sam 评论的那样,这是“按设计”。如果要在 EF 和 OData 之间共享公共源模型,则应使用 [Required] 属性。或者使用 fluent API.
修改模型 中修复