context.MyContext.SqlQuery () пропускает логику отображения из OnModelCreating () контекста? - PullRequest
0 голосов
/ 05 февраля 2019

Я только начал использовать EntityFramework 6 и все еще пробую некоторые сценарии.Я переопределил метод OnModelCreating () в своем классе контекста и имею некоторую логику в отношении некоторых отображений имен столбцов в свойствах, таких как:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("public");

    modelBuilder.Entity<Ninja>().Property(x => x.DateOfBirth).HasColumnName("date_of_birth");
}

Как вы можете видеть, имя свойства - DateOfBirth, и соответствующий столбец вБД является date_of_birth.Теперь, когда я добавляю / вставляю новые данные в БД, это отображение работает нормально.И когда я запрашиваю / извлекаю данные следующим образом:

var ninja = context.Ninjas.FirstOrDefault(n => n.Name.StartsWith("Kacy"));

Это прекрасно работает.

Но когда я хочу использовать функцию DB (postgre 10) для извлечения данных:

private static void RetrieveDataWithStoredProc()
{
    using (var context = new NinjaContext())
    {
        context.Database.Log = Console.WriteLine;
        var ninjas = context.Ninjas.SqlQuery("select * from get_old_ninjas()").ToList();
    }
}

Я получаю следующее исключение:

The data reader is incompatible with the specified 'NinjaDomain.DataModel.Ninja'.
A member of the type, 'DateOfBirth', does not have a corresponding column in the data reader with the same name.

Это означает, что он не учитывает логику в конструкторе моделей в отношении имени столбца свойства DateOfBirth.Если я добавлю явную логику отображения после SqlQuery, она будет работать ...

Мой вопрос заключается в том, почему этот метод не учитывает логику, уже существующую в методе OnModelCreating, как во всех других случаях?

1 Ответ

0 голосов
/ 05 февраля 2019

почему этот метод не учитывает логику, уже существующую в методе OnModelCreating, как все остальные случаи?

Это ограничение в EF6.EF Core учитывает сопоставления столбцов при загрузке из необработанных запросов SQL:

Имена столбцов в наборе результатов должны соответствовать именам столбцов, с которыми сопоставляются свойства.Обратите внимание, что это отличается от EF6, где сопоставление свойства / столбца было проигнорировано для необработанных запросов SQL, а имена столбцов результирующего набора должны были совпадать с именами свойств.

Необработанные запросы SQL (EF Core)

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