Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Instanciar uma Classe DAO em um Formulário ()

Pessoal, estou seguindo os passos do curso de Entity Framework mas usando Windows Form Aplication e "enrosquei" ao tentar instanciar uma classe DAO no form da aplicação. Acho que está relacionado ao construtor:

No formulário onde vou precisar da classe DAO está assim:

using Cadastro_de_Bombas.DAO;
using Cadastro_de_Bombas.Entidades;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Cadastro_de_Bombas
{
    public partial class frmCadastroBombas : Form
    {
        EntidadesContext contexto = new EntidadesContext();

    //o erro está no (contexto) da linha abaixo
        BombaDAO dao = new BombaDAO(contexto);

        public frmCadastroBombas()
        {
            InitializeComponent();
        }
        private void frmCadastroBombas_Load(object sender, EventArgs e)
        {...

e o erro do contexto reclama o seguinte: Error CS0236 A field initializer cannot reference the non-static field, method, or property

Lá na minha classe BombaDAO acredito que esteja tudo ok:

using Cadastro_de_Bombas.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cadastro_de_Bombas.DAO
{
    public class BombaDAO
    {

        private EntidadesContext contexto;
        public BombaDAO(EntidadesContext contexto)
        {
            this.contexto = contexto;
        }

        public void AdicionaBomba(Bomba b)
        {
            this.contexto.Bombas.Add(b);
            this.contexto.SaveChanges();
        }

        public void AtualizaBomba(Bomba b)
        {
            this.contexto.SaveChanges();
        }

        public void RemoveBomba(Bomba b)
        {
            this.contexto.Bombas.Remove(b);
            this.contexto.SaveChanges();
        }

        public Bomba BuscaBombaPorId(int id)
        {
            return this.contexto.Bombas.FirstOrDefault(p => p.ID == id);
        }...

Peço desculpas se for um erro primário com construtores ou encapsulamento, mas não consegui resolver sozinho. Agradeço por qualquer ajuda! Abraços!

7 respostas

Oi Samuel, tudo bom?

Posso dar uma olhada na sua classe EntidadesContext?

Não me parece ter nada errado no código que você mandou agora.

Aguardo retorno =)

Olá André, tudo bem? Segue como está minha classe EntidadesContext:

using Cadastro_de_Bombas.Entidades;
using Microsoft.Data.Entity;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cadastro_de_Bombas
{
    public class EntidadesContext : DbContext
    {
        public DbSet<Bomba> Bombas { get; set; }


        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string stringConexao = ConfigurationManager.ConnectionStrings["BombasConnectionString"].ConnectionString;
            optionsBuilder.UseSqlServer(stringConexao);
            base.OnConfiguring(optionsBuilder);
        }
    }
}

Tentei fazer uma modificação usando o construtor do formulário frmCadastroBombas como solução sugerida no MSDN (https://msdn.microsoft.com/en-us/library/5724t6za.aspx) e agora o erro mudou:

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Cadastro_de_Bombas
{
    public partial class frmCadastroBombas : Form
    {
        EntidadesContext contexto = new EntidadesContext();
        //BombaDAO bombaDAO = new BombaDAO(contexto); <- problema inicial (contexto)
        BombaDAO bombaDAO;

        //Construtor do formulário
        public frmCadastroBombas()
        {
            bombaDAO = contexto;   // agora o problema está neste = contexto; erro reclamado é o CS0029
            InitializeComponent();
        }

O erro reclamado agora é o Error CS0029 Cannot implicitly convert type 'Cadastro_de_Bombas.EntidadesContext' to 'Cadastro_de_Bombas.DAO.BombaDAO'

Seria o problema eu estar usando dois contextos (Um do EntidadesContext e outro do BombaDAO) com o mesmo nome de variável, no caso "contexto"?

solução!

Oi Samuel, dando uma olhada melhor no seu código:

public partial class frmCadastroBombas : Form
    {
        EntidadesContext contexto = new EntidadesContext();
        //BombaDAO bombaDAO = new BombaDAO(contexto); <- problema inicial (contexto)
        BombaDAO bombaDAO;

        //Construtor do formulário
        public frmCadastroBombas()
        {
            bombaDAO = contexto;   // aqui você está relacionando contexto que é do tipo EntidadesContext, com bombaDao que é do tipo BombaDao
            InitializeComponent();
        }

Acredito que o que você realmente quer aqui é receber esse contexto por parametro, certo? algo como:

public partial class frmCadastroBombas : Form
    {
        EntidadesContext contexto = new EntidadesContext();
        //BombaDAO bombaDAO = new BombaDAO(contexto); <- problema inicial (contexto)
        BombaDAO bombaDAO;

        //Construtor do formulário
        public frmCadastroBombas(BombaDAO contexto)
        {
            bombaDAO = contexto;   // agora sim estamos relacionando coisas iguais
            InitializeComponent();
        }

Você também pode tentar resolver o problema do seu bombaDAO basta nós relacionarmos os dois no construtor:

public partial class frmCadastroBombas : Form
    {
        EntidadesContext contexto = new EntidadesContext();
        BombaDAO dao;

        public frmCadastroBombas()
        {
        this.dao = new BombaDAO(this.contexto);
            InitializeComponent();
        }
        private void frmCadastroBombas_Load(object sender, EventArgs e)
        {...

Ou, até mesmo, receber o dao já pronto pelo construtor. Afinal, não é responsabilidade da classe frmCadastroBombas construir também o dao =). Algo como:

public partial class frmCadastroBombas : Form
    {
        BombaDAO dao;

        public frmCadastroBombas(BombaDAO dao)
        {
        this.dao = dao; //já traz ele pronto
            InitializeComponent();
        }
        private void frmCadastroBombas_Load(object sender, EventArgs e)
        {...

Antes de dar new em frmCadastroBombas, você cria seu contexto, seu dao, relaciona os dois e ja passa o dao pronto pro frmCadastroBombas. Algo como:

        EntidadesContext contexto = new EntidadesContext();
        BombaDAO dao = new BombaDAO(this.contexto);
        frmCadastroBombas form = new frmCadastroBombas(dao);

Lembre-se que toda classe deve começar com letra maiscula, então nosso frmCadastroBombas deveria ser FrmCadastroBombas.

Abraço e bons estudos =)

Excelente André Chaves! De imediato já lhe agradeço pela aula!

Quando você cita: " Antes de dar new em frmCadastroBombas, você cria seu contexto, seu dao, relaciona os dois e ja passa o dao pronto pro frmCadastroBombas. Algo como:

EntidadesContext contexto = new EntidadesContext();
        BombaDAO dao = new BombaDAO(this.contexto);
        frmCadastroBombas form = new frmCadastroBombas(dao);

" Onde devo inserir este bloco, na classe BombaDAO ou no FrmCadastroBombas?

Na verdade, você precisaria passar por esse processo quando quisesse criar um frmCadastroBombas =)

Normalmente algum método main ou controller...

Correto, neste caso estou fazendo dentro do próprio formulário onde ele é chamado na inicialização, a build ainda está bem simples. Muito obrigado pela disposição em ajudar! Grande abraço!