none
Um banco vários contextos? RRS feed

  • Pergunta

  • Olá pessoal!

    Gostaria de saber se é possível usar um banco existente com code first, o meu problema é que preciso usar vários contextos no mesmo banco.

    Ex.: preciso de um contexto Paciente, e outro contexto Farmácia, mais os dois teriam que estar no mesmo banco!

     

    Obs. procurei e não consegui achar nada a respeito, alguém pode me ajudar ai!, pode ser que esteja tentando trabalhar da forma errada também, tipo se tenho um banco muito grande como trato isso separando em vários contexto mesmo?

     


    Cleyton Ferrari [ twitter: @cleytonferrari - Site: TI Selvagem ]
    quinta-feira, 17 de novembro de 2011 19:34

Respostas

  • Seguinte pessoal, consegui aparentemente, basta acrecentar na FarmaciaDB e no PacienteDB o seguinte metodo

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
     }
    


     Com isso ele para de checar o EdmMetadata, ai funciona, mas só funciona na ordem apresentada na Program.cs, ou seja primeiro ele vai rodar o Contexto da Farmácia, e depois o de paciente, porque?

    Funciona assim como mandei remover a checagem do metadata, ele supõem que meu banco esta feito e com todas as entidades, e nessa ordem de execução como não tenho o banco na primeira execução ele cria, logo ele criou a tabela paciente, que no segundo contexto é utilizado, se a ordem for inversa na primeira execução, ele vai criar o banco somente com a tabela paciente, ai o segundo contexto farmácia, vai precisar da entidade farmácia ele  não vai existir, ou você executa na ordem que está ou cria as tabelas na mão no banco!

    Obrigado ai Pedro Henrique!


    Cleyton Ferrari [ twitter: @cleytonferrari - Site: TI Selvagem ]
    • Marcado como Resposta Cleyton Ferrari quinta-feira, 17 de novembro de 2011 21:26
    quinta-feira, 17 de novembro de 2011 21:26

Todas as Respostas

  • Você pode sem problemas.

     

    Referencia as entidades de Paciente com o ObjectSet ou DbSet no seu Contexto de Paciente e o mesmo para o contexto de Farmácia.

     

    Aí quando você quiser inserir ou atualizar ou selecionar os dados de alguma tabela do contexto paciente vai utilizar o contexto paciente e o mesmo para farmácia

     

    Ex:

     

    public class PacienteContext : DbContext {
    
    	public DbSet<Paciente> Paciente {get; set; }
    
    	public DbSet<Procedimento> Procedimento {get; set; }
    
    }
    
    
    
    public class FarmaciaContext : DbContext {
    
    	public DbSet<Farmacia> Farmacia { get; set; }
    
    	public DbSet<Medicamento> Medicamento {get; set; }
    
    }

     


    Pedro Henrique B. Fernandes
    MCTS - .NET Framework 4, Data Access
    MCTS - .NET Framework 4, Web Applications
    Site: pedrofernandes.net
    quinta-feira, 17 de novembro de 2011 20:12
  • Opa! Pedro Henrique, seguinte vou colocar o codigo de exemplo aqui pra facilitar:

     Paciente.cs

    namespace MultiploContexto
    {
        class Paciente
        {
            public int Id { get; set; }
            public string Nome { get; set; }
        }
    }
    
    

    Farmacia.cs

    namespace MultiploContexto
    {
        class Farmacia
        {
            public int Id { get; set; }
            public Paciente Paciente { get; set; }
        }
    }
    
    


    PacienteDB.cs

    using System.Data.Entity;
    
    namespace MultiploContexto
    {
        class PacienteDB : DbContext
        {
            public DbSet<Paciente> Pacientes { get; set; }
    
            public PacienteDB(string conexao = "Saude") : base(conexao)
            {
    
            }
        }
    }
    
    

    FarmaciaDB.cs

    using System.Data.Entity;
    
    namespace MultiploContexto
    {
        class FarmaciaDB:DbContext
        {
            public DbSet<Farmacia> Farmacias { get; set; }
    
            public FarmaciaDB(string conexao = "Saude") : base(conexao)
            {
    
            }
    
        }
    }
    
    


    Program.cs

    using System;
    
    namespace MultiploContexto
    {
        class Program
        {
            static void Main()
            {
                using (var dbFarmacia = new FarmaciaDB())
                {
                    dbFarmacia.Farmacias.Add(
                        new Farmacia
                            {
                                Paciente = new Paciente
                                               {
                                                   Nome = "Cleyton Ferrari"
                                               }
                            });
                    dbFarmacia.SaveChanges();
                    Console.WriteLine("Farmacia Ok");
                }
    
                using (var dbPaciente = new PacienteDB())
                {
                    dbPaciente.Pacientes.Add(new Paciente
                                                 {
                                                     Nome = "Anderson Lopes"
                                                 });
                    dbPaciente.SaveChanges();
                    Console.WriteLine("Paciente Ok");
                }
    
            }
        }
    }
    
    

    App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="Saude"
             connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Saude"
             providerName="System.Data.SqlClient" />
      </connectionStrings>
    </configuration>
    


    Nos teste aqui, se eu não utilizar o app.config, ou seja não setar que os dois contexto vão utilizar o mesmo banco funciona, mas se eu setar para eles usar o mesmo banco não funciona da o seguinte erro:

    The model backing the 'PacienteDB' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the DropCreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

    O que eu pude entender é que ele tenta criar novamente a tabela de paciente, mas ela já existe, ou seja ele checa a tabela no banco EdmMetadata, deve ter uma maneira de ele não checar ai acredito que vá funcionar!

    Alguém ai pode ajudar?


    Cleyton Ferrari [ twitter: @cleytonferrari - Site: TI Selvagem ]
    quinta-feira, 17 de novembro de 2011 21:00
  • Seguinte pessoal, consegui aparentemente, basta acrecentar na FarmaciaDB e no PacienteDB o seguinte metodo

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
     }
    


     Com isso ele para de checar o EdmMetadata, ai funciona, mas só funciona na ordem apresentada na Program.cs, ou seja primeiro ele vai rodar o Contexto da Farmácia, e depois o de paciente, porque?

    Funciona assim como mandei remover a checagem do metadata, ele supõem que meu banco esta feito e com todas as entidades, e nessa ordem de execução como não tenho o banco na primeira execução ele cria, logo ele criou a tabela paciente, que no segundo contexto é utilizado, se a ordem for inversa na primeira execução, ele vai criar o banco somente com a tabela paciente, ai o segundo contexto farmácia, vai precisar da entidade farmácia ele  não vai existir, ou você executa na ordem que está ou cria as tabelas na mão no banco!

    Obrigado ai Pedro Henrique!


    Cleyton Ferrari [ twitter: @cleytonferrari - Site: TI Selvagem ]
    • Marcado como Resposta Cleyton Ferrari quinta-feira, 17 de novembro de 2011 21:26
    quinta-feira, 17 de novembro de 2011 21:26