Я новичок в OData и EDM. Я пытаюсь реализовать их в решении Visual Studio 2019 с проектом Blazor WebAssembly и веб-API. NET Core 3.1. Проблема, с которой я сталкиваюсь, заключается в проекте веб-API.
Чтобы настроить OData с помощью EDM, я вызываю:
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 не определил свойство уникального идентификатора. Но это так. И это publi c, а свойство называется Id
в соответствии с соглашением. Проблема заключается в том, что тип свойства не является одним из типов примитивов Edm из OData spe c:
- Edm.Boolean
- Edm.Byte
- Edm.Date
- Edm.DateTimeOffset
- Edm.Decimal
- Edm.Duration
- Edm.Guid
- Edm.Int16
- Edm.Int32
- Edm.Int64
- Edm.SByte
- Edm.String
- Edm.TimeOfDay
Свойство My Id - это строго типизированный Id (объект значения) с именем StudentId
, базовый тип которого System.Guid
, который отображается на Edm.Guid
.
Можно использовать строго типизированные идентификаторы с Entity Framework Core и Json Сериализация с использованием TypeConverters, JsonConverters и конфигурации EF. Конечно, должна быть возможность использовать строго типизированные идентификаторы с EDM / OData с использованием какого-либо преобразования типов?
Может кто-нибудь подсказать, как настроить EDM / OData, чтобы распознать, что мой объект значения StudentId
можно распаковать в простой Edm.Guid
, чтобы он не выдавал это исключение?
Если вышеприведенного недостаточно, чтобы увидеть возникшую у меня проблему, здесь доступно минимальное повторение:
https://github.com/BenjaminCharlton/ODataWithStronglyTypedIdsRepro
Спасибо за ваш совет!
Бенджамин