Загрузите не сопоставленный атрибут с EF Core - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь загрузить объект с EF Core, вызвав хранимую процедуру. Сущность сопоставляется с таблицей путем плавного сопоставления, которое не содержит все столбцы, выбранные хранимой процедурой.

Выбранные поля, которые не существуют в качестве столбцов таблицы, игнорируются в конфигурации объекта следующим образом:

        modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Latitude);
        modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Longitude);
        modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Radius);
        modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Distance);

Хранимая процедура вызывается так:

await SalesContext.CustomerLocation
            .FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
                lon, radius)
            .ToListAsync();

Когда запрос выполняется, игнорируемые столбцы не отображаются на объект. Есть ли возможность сопоставить игнорируемые поля с сущностью при вызове хранимой процедуры, или мне нужно создать другую сущность для хранимой процедуры или что-то в этом роде?

1 Ответ

0 голосов
/ 10 сентября 2018

Когда вы используете метод ignore для fluent api для столбца, он не будет создавать этот столбец на сервере sql (игнорирует его).
Ваш результат хранимой процедуры даст вам несколько столбцов на основе вашего созданного запроса и имена этих столбцов должны совпадать с именами свойств вашей сущности.
Например, ваша процедура дает вам таблицу с этими столбцами, а также совпадающими типами данных на сервере sql и в вашем классе:

  1. Широта
  2. Долгота
  3. Радиус
  4. Расстояние

Затем вы должны создать класс для вашей процедуры:

public class LocationProcedure {
   public string Latitude {get;set;}
   public string Longitude {get;set;}
   public string Radius {get;set;}
   public string Distance {get;set;}
}

, а также добавьте dbset этого типа в ваш dbContext с [NotMapped] Атрибут:

[NotMapped]
public DbSet<LocationProcedure> CustomerLocation {get; set:}

Атрибут сообщает, что это не должна быть таблица в базе данных.

Наконец, вы можете использовать вашу процедуру с новым набором данных CustomerLocation, а затем она отобразит результаты в LocationProcedure class.

await SalesContext.CustomerLocation
            .FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
                lon, radius)
            .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...