【发布时间】:2020-07-22 23:35:10
【问题描述】:
我是 OData 和 EDM 的新手。我正在尝试在具有 Blazor WebAssembly 项目和 .NET Core 3.1 Web API 的 Visual Studio 2019 解决方案中实现它们。我遇到的问题出在 Web API 项目中。
要使用 EDM 配置 OData,我正在调用:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//etc.
app.UseEndpoints(endpoints =>
{
//etc.
endpoints.Select().Filter().OrderBy().Count().MaxTop(1000);
endpoints.MapODataRoute("api", "api", GetEdmModel());
// etc.
});
}
}
GetEdmModel() 函数是:
private IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<ViewStudentDto>("Students");
return odataBuilder.GetEdmModel();
}
在运行时出现错误:
System.InvalidOperationException:实体集 Students 基于类型 > MySchool.Dtos.Students.ViewStudentDto 没有定义键
我理解错误。它抱怨我的 DTO 类 ViewStudentDto 没有定义唯一标识符属性。但它有。它是公开的,并且该属性按照惯例命名为Id。问题是该属性的类型不是 OData 规范中的 Edm 原始类型之一:
- Edm.Boolean
- Edm.Byte
- Edm.Date
- Edm.DateTimeOffset
- Edm.Decimal
- Edm.持续时间
- Edm.Guid
- Edm.Int16
- Edm.Int32
- Edm.Int64
- Edm.SByte
- Edm.String
- Edm.TimeOfDay
我的 Id 属性是一个名为 StudentId 的强类型 Id(值对象),其基础类型为 System.Guid,映射到 Edm.Guid。
通过使用 TypeConverters、JsonConverters 和 EF 配置,可以将强类型 ID 与 Entity Framework Core 和 Json 序列化一起使用。肯定可以通过某种类型转换将强类型 ID 与 EDM/OData 一起使用吗?
谁能指导我如何配置 EDM/OData 以识别我的 StudentId 值对象可以解压缩为简单的 Edm.Guid 以便它不会引发此异常?
如果以上内容不足以看出我遇到的问题,这里有一个最小的复制:
https://github.com/BenjaminCharlton/ODataWithStronglyTypedIdsRepro
感谢您的建议!
本杰明
【问题讨论】:
-
您能发布您的
ViewStudentDto和StudentId课程吗? -
感谢您一直以来的支持!我没有在原始帖子中提供,因为我不想向您倾倒大量不必要的代码。但是,是的,当然!如果它可以帮助你帮助我,我会很乐意分享它。我用最少量的代码创建了这个 Git 存储库来显示问题。它位于:github.com/BenjaminCharlton/ODataWithStronglyTypedIdsRepro
标签: c# asp.net-core odata blazor