Как создать представление с использованием EF-кода POCO

Это просто. Мне нужно создать Просмотр, используя Code First. Я ничего не нашел об этом в google и SO. Есть ли способ сделать это?

Мне нужно, чтобы представление создавалось и запрашивалось с помощью linq, поэтому это не решение для его создания с использованием script для создания базы данных, например:

var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;

Также возможна работа вокруг. Мне нужен способ запроса сущностей относительно значений констант/не-сущностей.

Ответ 1

Вы не можете создавать представления с помощью EF Code First. Если вы хотите создать представление, тогда выполните создание sql script в Seed. Но вы все равно не сможете сопоставить сущность с этим представлением, за исключением модели взлома, создав и отбросив таблицу с тем же именем, что и ваше представление.

Некоторые полезные ссылки:

Ответ 2

вы должны вручную создать представление, точно так же, как сказал Анатолий. (Добавление индекса в таблицу).

Вы добавляете имя представления в качестве атрибута в свой класс

[Table("UserDTO")]
    public class UserDTO
{
    /* Class code here */
}

Вы можете создать пустую миграцию, указав в конце атрибут -IgnoreChanges

Add-Migration MigrationName -IgnoreChanges

Это дает вам пустую миграцию script, которую вы можете изменить вручную.

Вы можете использовать свой контекст db для выполнения кода в своем переносе script

public partial class editUserDTO : DbMigration
{
    public override void Up()
    {
        string script =
        @"
        CREATE VIEW dbo.UserDTO
        AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName
        FROM dbo.Users u
        INNER JOIN dbo.People p ON u.PersonId = p.PersonId";
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand(script);
    }

    public override void Down()
    {
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO");
    }
}

Ответ 3

Просто в головах, в EF 6.1 (не уверен, что раньше или нет) теперь есть опция Code First from Database, которую вы можете использовать, и она также будет отображаться на представления.

У меня лично есть мой отдельный проект, поэтому я могу просто извлечь код, который я хочу от него, и не повлиять на мой проект, который фактически использует базу данных. Чтобы использовать его Add a New file to your project -> Data -> ADO.NET Entity Data Model

Затем выберите опцию Code First from Database и выберите ваши представления (и другие таблицы, если хотите)

Он создаст его в виде табличного сопоставления, о котором Фред говорил в своем ответе, но сделает весь код для вас, который хорош. Вероятно, вы захотите изменить индексы и порядок.

Затем просто вызовите Sql(@"YOUR VIEW CREATE SQL HERE") в Up и добавьте Sql(@"DROP STATEMENT HERE") в Down

Ответ 4

Много хороших идей из официальных выпусков EF7:

1) У вас нет DbSet и вместо этого есть свойство или метод расширения

A) Свойство

class YourContext
{
    public IQueryable<YourView> YourView 
    {
        get
        {
            return this.Database.SqlQuery<YourView>("select * from dbo.YourView");
        }
    }
}

B) Метод расширения

static class YourContextExtensions
{
    public static IQueryable<YourView>(this YourContext context)
    {
        return context.Database.SqlQuery<YourView>("select * from dbo.YourView");
    }

2) По-видимому, вы можете заставить процесс миграции игнорировать некоторые dbsets

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  if (IsMigration)
    modelBuilder.Ignore<YourViewTable>();
 ...
}

(Все вышеперечисленное не проверено)

Ответ 5

Вы не можете создать представление из EF-кода. Сначала вы должны добавить script в "seed" script, чтобы предварительно заполнить представление.