select - ключевое слово не работает с odata, automapper и efcore - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь применить запрос odata к моему autopper-отображению в моем контексте efcore. Все работает как положено, пока я не использую опцию запроса $ select.

Когда я пытаюсь использовать ключевое слово select в запросе к моему контроллеру odata, я получаю исключение:

Исключение SerializationException: 'SourceSourceInjectedQuery`2' не может быть сериализовано с использованием ODataMediaTypeFormatter.

Я использую метод UseAsDataSource - Extension, потому что он был рекомендован здесь, на github .

Это мой oDataController:

public class StudentsController : ODataController {
    private readonly SchoolContext schoolContext;

    public StudentsController(SchoolContext schoolContext) {
        this.schoolContext = schoolContext;
    }
    [EnableQuery]
    public IActionResult Get() {

        return Ok(
            schoolContext
            .Students
            .UseAsDataSource()
            .For<StudentVM>()
        );
    }
}

Это моя сущность для EFCore:

public class Student {
    public int ID { get; set; }
    public string LastName { get; set; }
    public string FirstMidName { get; set; }
    public DateTime EnrollmentDate { get; set; }

    public ICollection<Enrollment> Enrollments { get; set; }
}

А это мой картографический профиль для автомаппера:

public class StudentVM {
    public int ID { get; set; }
    public string  LastName { get; set; }
    public string FirstMidName { get; set; }
}

public class StudentProfile : Profile {
    public StudentProfile() {
        CreateMap<Student, StudentVM>();
    }
}

Нужно ли для этого какое-то конкретное сопоставление?

1 Ответ

0 голосов
/ 21 апреля 2019

Я понял, что у меня была ошибка в моей конфигурации odataservice внутри моего запуска .cs

    private static IEdmModel GetEdmModel() {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Student>("Students");
        builder.EntitySet<Course>("Courses");
        return builder.GetEdmModel();
    }

Я помещаю туда свои сущности вместо моих моделей представления. Это фиксированный код:

    private static IEdmModel GetEdmModel() {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<StudentVM>("Students");
        builder.EntitySet<CourseVM>("Courses");
        return builder.GetEdmModel();
    }

Теперь он работает как положено

...