Как настроить строго типизированные идентификаторы сущностей (объекты-значения) с OData EDM - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в 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

Спасибо за ваш совет!

Бенджамин

1 Ответ

0 голосов
/ 10 апреля 2020

Используйте конструктор, чтобы указать ключ:

private IEdmModel GetEdmModel()
{
    var odataBuilder = new ODataConventionModelBuilder();
    var entitySet = odataBuilder.EntitySet<ViewStudentDto>("Students");

    entitySet.EntityType.HasKey(e => e.Id);
    entitySet.EntityType.Ignore(e => e.StudentId);

    return odataBuilder.GetEdmModel();
}

и добавить обновление DTO для использования свойства Id:

public class ViewStudentDto
{
    public Guid Id { get => StudentId.Value; set => StudentId = new StudentId(value); }

    [JsonIgnore]
    public StudentId StudentId { get; set; }

    public DateTime WhenEnrolled { get; set; }

    public string Name { get; set; }
}

...