EF Core: как запросить SQL View - PullRequest
1 голос
/ 22 января 2020

У меня есть SQL View в моей БД под названием 'dbo.Viewtest'. Это представление объединяет данные двух других таблиц с одинаковыми типами столбцов. Представление также добавляет столбец, чтобы показать, из какой таблицы получены данные.

Так выглядит представление SQL в SQL Обозревателе объектов сервера:

dbo.ViewTest

Id | Тип | Содержание | Расположение

1 | h1 | Добро пожаловать! | Главная

2 | р | Войти | Главная

3 | h2 | руководство | Главная

1 | h1 | информация | События

2 | р | следовать | События

Это представление создается из 2 таблиц, одна из которых называется «HomeContent», а другая «EventsContent» (отсюда и столбец местоположения). Представление было создано с использованием следующего кода:

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql("CREATE VIEW ViewTest AS " +
                "SELECT Id, Type, Content, 'Home' location FROM HomeContent UNION ALL " +
                "SELECT Id, Type, Content, 'Evenementen' FROM EvenementenContent");

        }

Затем я добавил класс модели следующим образом:

  [Table("ViewTest")]
    public class TestViewContent
    {
        [Key]
        public int Id { get; set; }
        public string Type { get; set; }
        public string Content { get; set; }
        public string Location { get; set; }
    }

И, наконец, я добавил его в свой DbContext:

 public DbSet<TestViewContent> TestViewContent { get; set; }

Теперь вот, где все начинает ломаться. Когда я пытаюсь отобразить это SQL представление, используя EF Core, я получаю следующий неправильный вывод:

Id | Тип | Содержание | Местоположение

1 | h1 | Добро пожаловать! | Главная

2 | р | Войти | Главная

3 | h2 | руководство | Главная

1 | h1 | Добро пожаловать Главная

2 | р | войти | Home

Как вы можете видеть, по любой причине, когда я пытаюсь отобразить SQL View, данные «зацикливаются», когда данные из таблицы «Events» должны отображаться. Так что по какой-то причине он отображает только данные из домашней таблицы.

Код, который я использую для отображения SQL View:

 private readonly DbApplicationContext_context;

        public TestViewContentController(DbApplicationContext_context)
        {
            _context = context;
        }

   public async Task<IActionResult> Index()
        {
            return View(await _context.TestViewContent.ToListAsync());
        }

Кто-нибудь может мне здесь помочь? В случае, если невозможно отобразить SQL -обзоры, кто-нибудь знает лучший способ объединить несколько таблиц и добавить столбец «Расположение», чтобы проследить таблицу, откуда берутся данные? Любая помощь будет принята с благодарностью!

1 Ответ

4 голосов
/ 22 января 2020

Это происходит потому, что вы указали [Key] в свойстве Id, но ваш VIEW выдает повторяющиеся значения в столбце Id при объединении двух таблиц. Тогда EF Core, вероятно, говорит: «Ах, снова Id = 1, у меня уже есть этот ряд, поэтому я буду его использовать повторно».

Существует три возможных исправления:

(1) Определите отдельный первичный ключ для VIEW, который гарантированно генерирует уникальные значения , а затем также используйте его в EF Core как [Key].

или

(2) Сохраните VIEW таким, какой он есть, затем в EF Core определите составной первичный ключ . Обратите внимание, что EF Core не поддерживает создание составного ключа с использованием атрибута [Key], вам необходимо использовать функцию Fluent API HasKey() , в данном случае для Location и Id properties.

или

(3) Не указывайте [Key] в целом, он может вам и не понадобиться, как описано в документации здесь: Типы сущностей без ключа .

...