. Net core 3.x Типы Keyless Entity избегают создания таблиц - PullRequest
2 голосов
/ 05 февраля 2020

Мне нужно выполнить сложный запрос sql в ядре платформы сущностей 3.1.1. При исследовании я обнаружил, что типы ключей без ключа - это путь к go в подходе, основанном на коде. Я вижу много документов для dbquery, но это помечено как устаревшее в. net core 3.x

типы ключей без ключа

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

Пример кода

public class ApplicationContext : DbContext
{
 public DbSet<CustomQuery> CustomQuery { get; set; }
 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
    modelBuilder.Ignore<CustomQuery>();
    modelBuilder.Entity<CustomQuery>().HasNoKey();
 }
}

с. net core 2.2

var entity = _context.Query<CustomQuery>().FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();

с. net core 3.1

var newEntity = _context.CustomQuery.FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();

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

или есть какой-то лучший подход к этой ситуации.

1 Ответ

2 голосов
/ 05 февраля 2020

Это известный дефект в EF Core 3, о котором здесь сообщается 3.0 Обновление - объект с HasNoKey () (ранее тип запроса) пытается создать таблицы при добавлении миграции # 18116 .

Закрыт как "дубликат" из Кому из методов: Предложение по рационализации ToTable, ToQuery, ToView, From Sql и других связанных методов # 17270 и Возможность исключения / skip / игнорировать части модели из миграций, чтобы таблица не создавалась (для перекрывающихся ограниченных контекстов) # 2725 , оба запланированы на выпуск 5.0, что означает, что она в конечном итоге будет решена в этом выпуске.

Текущий обходной путь упоминается в комментариях одного из членов команды EF Core:

На данный момент вы можете просто использовать что-то вроде .ToView("You forgot to use FromSql with ModQueueEntry")

или более широко, с использованием .ToView(null), например

modelBuilder.Entity<CustomQuery>().HasNoKey().ToView(null);
...