Как я могу предоставить API-интерфейс Querable с помощью OData для EF Core Keyless Entity (представление базы данных)? - PullRequest
0 голосов
/ 25 марта 2020

Я использую https://www.nuget.org/packages/Microsoft.AspNetCore.OData/7.3.0 для предоставления API-интерфейса на основе OData 4 с использованием ASP. NET Core 3.1 API

У меня есть контекст данных EF с объектом без ключа (представление базы данных) ), Когда я пытаюсь показать его с помощью модели OData Convention

   modelBuilder
   .Entity<Student>(eb =>
    {
        eb.HasNoKey();
        eb.ToView("vw_students", "public");
    });

А вот мое отображение OData EDM Model с типом сущности EF Core

var edmBuilder = new ODataConventionModelBuilder();
edmBuilder.EntitySet<Student>("Students");       
return edmBuilder.GetEdmModel();

Я получаю ошибка в этой строке поддерживается моделью OData? 2) Есть ли обходной путь?

1 Ответ

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

Похоже, что безключевые сущности явно не поддерживаются в Edata Model Builder в OData: https://github.com/OData/ModelBuilder/blob/86d26d7346e9359e64e5ec08c31ac7e829cbe788/src/Microsoft.OData.ModelBuilder/ODataModelBuilder.cs#L629

Таким образом, ответ на ваш первый вопрос пока нет.

Что касается второго вопроса, это может оказаться невозможным в вашем случае использования, но если ваша сущность без ключа соответствует представлению в вашей базе данных, вы можете просто построить нормальную (не ключевую) сущность, если есть столбец или комбинация столбцы на этом представлении это уникально. В одной из моих моделей я создал класс сущностей, соответствующий представлению базы данных, а затем добавил атрибут [Key] к свойству столбца в этом представлении, которое гарантированно будет уникальным для каждой записи. Тогда OData рассматривает это так же, как и любой другой объект. Единственное предостережение - это то, что он доступен только для чтения.

Если, с другой стороны, вы хотите отобразить объект без ключа в OData, потому что он извлекает столбцы из нескольких таблиц / представлений базы данных (как вы могли бы сделать с определяющий запрос в классе * (1013 * EF), и вы не хотите создавать новое представление в своей базе данных, я думаю, вам не повезло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...