como usar visualizações na estrutura de entidade de código primeiro [fechado]

87

Como posso usar a visualização do banco de dados no código da estrutura da entidade primeiro,

Sagar
fonte
2
Nenhuma das respostas abaixo explica como criar uma visualização usando migrações EF. Veja esta resposta para uma pergunta semelhante.
Rudey
Aqui está um tópico com exatamente a mesma pergunta. - stackoverflow.com/questions/13593845/…
Div Tiwari
Experimente minha solução . Impede a geração de migração para tabelas marcadas como visualizações
kogoia

Respostas:

95

Se, como eu, você está interessado apenas em mapear entidades vindas de outro banco de dados (um erp no meu caso) para relacioná-las a entidades específicas de seu aplicativo, então você pode usar as visualizações como usa uma tabela (mapeie a visualização em o mesmo caminho!). Obviamente, se você tentar atualizar essas entidades, obterá uma exceção se a visualização não for atualizável. O procedimento é o mesmo que no caso de entidades normais (com base em uma tabela):

  1. Crie uma classe POCO para a visualização; por exemplo FooView
  2. Adicione a propriedade DbSet na classe DbContext
  3. Use um arquivo FooViewConfiguration para definir um nome diferente para a visualização (usando ToTable ("Foo"); no construtor) ou para definir propriedades específicas

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. Adicione o arquivo FooViewConfiguration ao modelBuilder, por exemplo, substituindo o método OnModelCreating do Contexto:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    
Daniele Armanasco
fonte
64
+1 por não assumir que "Código Primeiro" == geração automática de banco de dados
onetwopunch
3
@DaveJellison, você gostaria de elaborar ou fornecer um link sobre como adicionar uma visualização como parte de um IDatabaseInitializer
Ralph Shillington
18
Sou só eu ou todos estão recebendo uma mesa vazia criada pela migração? Existe uma maneira de evitar isso?
Kremena Lalova
4
Apenas tendo certeza aqui, esta solução requer que criemos um View no banco de dados SQL externamente? É possível definir a visualização no código e fazer com que ela seja preenchida no banco de dados por meio do comando Add-Migration / Update-Database?
frostshoxx,
6
Algumas coisas. 1. Esta resposta não menciona que você tem que criar a visão manualmente usando SQL, isso pode ser feito usando uma migração. 2. Você não precisa configurar o nome da visualização se o nome da classe corresponder ao nome da visualização. 3. Você pode usar DataAnnotations assim:, [Table("myView")]isso é indiscutivelmente mais simples do que usar a criação de um EntityTypeConfiguration.
Rudey
23

Isso pode ser uma atualização, mas para usar visualizações com Código EF primeiro simplesmente adicione [Table ("NameOfView")] ao topo da classe e tudo deve funcionar corretamente sem ter que passar por todos os obstáculos que todos estão passando. Além disso, você terá que relatar uma das colunas como uma coluna [chave]. Aqui está meu código de exemplo abaixo para implementá-lo.

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SomeProject.Data
{
    [Table("SomeView")]
    public class SomeView
    {
        [Key]
        public int NameID { get; set; }
        public string Name { get; set; }
    }
}

E aqui está a aparência do contexto

using System.Data.Entity;

namespace SomeProject.Data
{
    public class DatabaseContext : DbContext
    {
        public DbSet<SomeView> SomeViews { get; set; }
    }
}
Al Katawazi
fonte
2
Esta é a mesma resposta aceita, exceto que usa DataAnnotations enquanto a resposta aceita usa EF Fluid API.
Rudey
4
Na verdade não, não é. Tentei, sem sucesso, a resposta aceita e não funcionou bem para mim. Mas então estou usando migrações, então isso pode ter impactado as coisas. Eu descobri que tinha que fazer minhas migrações primeiro ENTÃO adicionar minha classe de visualização, pois ela já existia no banco de dados. Faríamos isso exatamente da mesma maneira se já tivéssemos tabelas existentes no banco de dados. Como uma exibição é uma "tabela virtual", a sintaxe da tabela no Entity Framework ainda funciona.
Charles Owen
11

Se tudo o que você quer é um monte de objetos desnormalizados, então você pode apenas criar uma IQueryable<TDenormolized>propriedade get-only pública em sua DbContextclasse.

No, getvocê retorna um resultado do Linq para projetar os valores desnormalizados em seus objetos desnormalizados. Isso pode ser melhor do que escrever uma Visualização do banco de dados porque você está programando, não está limitado apenas pelo uso de selectinstruções. Também é seguro para o tipo de tempo de compilação.

Apenas tome cuidado para não acionar enumerações como ToList()chamadas, isso interromperá a consulta adiada e você pode acabar recebendo um milhão de registros de volta do banco de dados e filtrando-os em seu servidor de aplicativos.

Não sei se esse é o caminho certo, mas tentei e funciona para mim.

Oldhouseye
fonte
6
Uma das razões pelas quais eu gostaria de usar visualizações é que o SQL gerado por EF nem sempre é 'bom' - temos algumas hierarquias de herança em nosso modelo (descobrimos sobre as armadilhas tarde demais ...) e o uso de visualizações nos permite para criar manualmente o SQL. Apenas um contraponto de por que uma vista seria preferível
Carl
2
Outro motivo para não fazer isso pode ser o uso de expressões de tabela comuns recursivas, que não estão disponíveis no LINQ. Caso contrário, este é um bom conselho para cenários mais simples.
Tom Pažourek
1
Usar uma propriedade em vez de uma visão não é uma opção se você quiser fazer uso dos benefícios de uma visão indexada .
Rudey
"você não está limitado por apenas usar declarações selecionadas". O que você quer dizer com isso? Tudo o que você pode fazer com o LINQ pode ser feito usando instruções SELECT, o mesmo não pode ser dito do contrário.
Rudey
3

Eu sei que esta é uma pergunta antiga e há muitas respostas aqui, mas eu forcei a um problema quando uso esta resposta e ocorreu um erro ao usar o comando update-database no console do gerenciador de pacotes:

Já existe um objeto chamado '...' no banco de dados.

e eu uso estas etapas para resolver esse problema:

  1. execute este comando no console do gerenciador de pacotes: Adicionar inicial de migração
  2. Na pasta Migrations, você pode encontrar o arquivo ..._ intial.cs, abri-lo e comentar ou excluir qualquer comando relacionado à sua classe que você deseja mapear
  3. agora você pode normalmente usar o comando update-database para qualquer outra mudança em seus modelos

espero que ajude.

Sepehr Estaki
fonte
1
Obrigado! Isso realmente ajudou! Como um extra, em vez de apenas remover o código gerado com EF Migrations, você pode adicionar lá migrationBuilder.Sql("CREATE OR REPLACE VIEW ...); Para que os colegas também possam usá-lo para atualizar seu banco de dados.
Rich_Rich