Создание представлений базы данных с использованием EF Core Code First - PullRequest
1 голос
/ 04 ноября 2019

Я работаю над новым приложением, которое требует создания БД Views. Я использую ядро ​​EF со вкусом MySql и использую подход Code First для создания БД и таблиц. Хотя я не нашел способа создать представление. Если каким-то образом я мог выполнить необработанный sql на этапе миграции, это могло бы помочь в создании представления и последующем отображении его как DbSet. Я не могу создать представления вручную, так как это потребует выполнения сценария представления для базы данных, а это невозможно в более высокой среде. Может кто-нибудь, пожалуйста, направьте меня. Помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Насколько я знаю, вы не можете создавать представления непосредственно с EF Core. Однако вы можете использовать миграции для выполнения произвольного SQL при обновлении.

  1. Создание миграции в консоли диспетчера пакетов, даже если на самом деле ничего не нужно делать: add-migration CreatingTheView
  2. Открытьсгенерированный класс миграции, имя файла: Migrations\yyyyMMdd_CreatingTheView.cs
  3. Добавить необработанный SQL для выполнения при обновлении, изменив метод Up: migrationBuilder.Sql("CREATE VIEW etc.");
  4. Если вы хотите поддержать понижение, изменитеDown метод: migrationBuilder.Sql("DROP VIEW etc.");
0 голосов
/ 07 ноября 2019

Поскольку вы используете Code First, может быть, база данных - это просто расширение для приложения, а не его основная цель? В этом случае вам, вероятно, на самом деле не нужно представление.

Для базы данных все равно, если вы просто отправляете ей обычные запросы, и у вас есть альтернативы для их абстрагирования на прикладном уровне. Самый простой способ - просто создать свойство IQueryable<T> в вашей реализации DbContext (или метод расширения), которое запрашивает данные, которые вы хотите отобразить. Примерно так:

public sealed class DatabaseContext : DbContext
{
    public DbSet<Transaction> Transactions { get; set; }

    public IQueryable<PerPersonSum> PerPersonSums
        => Transactions.GroupBy(t => t.Person,
                                (k, g) => new PerPersonSum
                                {
                                    Person = k,
                                    TotalAmount = g.Sum(t => t.Amount)
                                });
}

Более подходящим решением будет тип ключа без ключа :

public sealed class DatabaseContext : DbContext
{
    public DbSet<Transaction> Transactions { get; set; }

    public DbSet<PerPersonSum> PerPersonSums { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PerPersonSum>(e =>
        {
            e.HasNoKey();
            e.ToQuery(() => Transactions.GroupBy(t => t.Person,
                                                 (k, g) => new PerPersonSum
                                                 {
                                                     Person = k,
                                                     TotalAmount = g.Sum(t => t.Amount)
                                                 }));
        });
    }
}

Pre-3.0, раньше он назывался QueryВведите и это можно использовать так:

public sealed class DatabaseContext : DbContext
{
    public DbSet<Transaction> Transactions { get; set; }

    public DbQuery<PerPersonSum> PerPersonSums { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Query<PerPersonSum>()
                    .ToQuery(() => Transactions.GroupBy(t => t.Person,
                                                        (k, g) => new PerPersonSum
                                                        {
                                                            Person = k,
                                                            TotalAmount = g.Sum(t => t.Amount)
                                                        }));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...