ObjectDisposedException EF错误

时间:2016-09-06 18:15:35

标签: c# entity-framework

我遇到了问题因为我总是按下操作按钮我得到了这个例外。

This error

这部分给我一个错误

public void InserirComCopia(TabelaPreco tabPrec, string copiarDe)
    {
        var lista = new List<PrecoProduto>();
        var tb = InserirTabelaVazia(tabPrec);
        var rep = new PrecoRepositorio();
        lista = rep.ObterPrecoPorTabela(Int32.Parse(copiarDe));
        var ls = new List<PrecoProduto>();

        using (var context = new indigo.DataModel.IndigoContext())
        {
            foreach (var item in lista)
            {
                var p = new PrecoProduto()
                {
                    preco = item.preco,
                    TabPreco = tb,
                    TabPrecoId = tb.Id,
                    Produto = item.Produto,
                    ProdutoId = item.ProdutoId
                };
                ls.Add(p);
            }
            context.PrecoProduto.AddRange(ls);
            context.SaveChanges();
        }
    }

这就是我的控制者:

public TabelaPreco ObterTablePrecoPorID(int Id, List<TabelaPreco> tabelaPreco)
    {
        return tabelaPreco.Where(t => t.Id == Id)
                          .FirstOrDefault();
    }
    public List<TabelaPreco> ObterTodasAsTabelas()
    {
        List<TabelaPreco> model = new List<TabelaPreco>();
        using (var context = new indigo.DataModel.IndigoContext())
        {
            model = context.TabelaPreco.ToList();
        }
        return model;
    }
    public List<TabelaPreco> Buscar(string busca)
    {
        List<TabelaPreco> model = new List<TabelaPreco>();
        using (var context = new indigo.DataModel.IndigoContext())
        {
            model = context.TabelaPreco.Where(tb => tb.Desc.Contains(busca)).ToList();
        }
        return model;
    }
    public TabelaPreco InserirTabelaVazia(TabelaPreco tab)
    {
        using (var context = new indigo.DataModel.IndigoContext())
        {
            context.TabelaPreco.Add(tab);
            context.SaveChanges();
            return tab;
        }
    }
    public void Deletar(int id)
    {
        var tabela = new TabelaPreco();
        using (var context = new indigo.DataModel.IndigoContext())
        {
            tabela = context.TabelaPreco.Where(tb => tb.Id == id)
                                        .FirstOrDefault();
            context.TabelaPreco.Remove(tabela);
            context.SaveChanges();
        }
    }
    public void InserirComCopia(TabelaPreco tabPrec, string copiarDe)
    {
        var lista = new List<PrecoProduto>();
        var tb = InserirTabelaVazia(tabPrec);
        var rep = new PrecoRepositorio();
        lista = rep.ObterPrecoPorTabela(Int32.Parse(copiarDe));
        var ls = new List<PrecoProduto>();

        using (var context = new indigo.DataModel.IndigoContext())
        {
            foreach (var item in lista)
            {
                var p = new PrecoProduto()
                {
                    preco = item.preco,
                    TabPreco = tb,
                    TabPrecoId = tb.Id,
                    Produto = item.Produto,
                    ProdutoId = item.ProdutoId
                };
                ls.Add(p);
            }
            context.PrecoProduto.AddRange(ls);
            context.SaveChanges();
        }
    }
    public TabProdListModel PegarProdutosDaTabela(int id)
    {
        using (var context = new indigo.DataModel.IndigoContext())
        {
            var modelTab = context.TabelaPreco.Where(tb => tb.Id == id).First();
            var modelProd = context.Produto.ToList();
            var model = context.TabelaPreco
                           .Where(t => t.Id == id)
                           .Join(
                               context.PrecoProduto,
                               t => t.Id,
                               x => x.TabPrecoId,
                               (t, x) => new { t, x }
                           )
                           .Join(
                               context.Produto,
                               p => p.x.ProdutoId,
                               y => y.Id,
                               (p, y) => new ListProduto
                               {
                                   produtoId = y.Id,
                                   produto = y.Nome,
                                   precoProduto = p.x.preco,
                                   Cor = y.Cor,
                                   Tamanho = y.Tamanho
                               }
                           )
                           .ToList();

            var ls = new TabProdListModel()
            {
                tabela = modelTab,
                Produtos = modelProd,
                TdProdutos = model
            };

            var prod = ls.Produtos.ToList();
            if (modelProd.Count() != 0)
                foreach (var item in ls.Produtos)
                {
                    foreach (var td in ls.TdProdutos)
                    {
                        if (item.Id == td.produtoId)
                        {
                            prod.Remove(item);
                            break;
                        }

                    }
                }

            ls.Produtos = prod;
            return ls;
        }
    }
    public void AdicionarProdTab(int Produto, double Valor, int Tabela)
    {
        using(var context = new indigo.DataModel.IndigoContext())
        {
            var produto = context.Produto.Where(p => p.Id == Produto).FirstOrDefault();
            var tabela = context.TabelaPreco.Where(tp => tp.Id == Tabela).FirstOrDefault();
            var precoProduto = new PrecoProduto()
            {
                preco = Valor,
                Produto = produto,
                TabPreco = tabela
            };
            context.PrecoProduto.Add(precoProduto);
            context.SaveChanges();
        }
    }
    public void EditarProdutoTabela(int ProdutoId, double valor, int tabela)
    {
        using (var context = new indigo.DataModel.IndigoContext())
        {
            var precoProduto = context.PrecoProduto.Where(x => x.ProdutoId == ProdutoId && x.TabPrecoId == tabela).FirstOrDefault();
            precoProduto.preco = valor;
            context.PrecoProduto.Attach(precoProduto);
            var Entry = context.Entry(precoProduto);
            Entry.Property(e => e.preco).IsModified = true;
            context.SaveChanges();
        }
    }
    public void Remover(int id)
    {

    }

请帮助我!

PS:抱歉我的英语不好,我是巴西代码学生

更新: 我的存储库:

public List<PrecoProduto> ObterPrecoPorTabela(int copiarDe)
    {
        var Precos = new List<PrecoProduto>();
        using (var context = new indigo.DataModel.IndigoContext())
        {
            Precos = context.PrecoProduto.Where(pp => pp.TabPrecoId == copiarDe).ToList();
        }
        return Precos;
    }

1 个答案:

答案 0 :(得分:1)

在这一行:TabPreco = tb,然后是Produto = item.Produto,我不能肯定你能做到。您正在获取一个正确连接到您的数据库上下文的对象,并尝试将其附加到不再附加的内容上。也许尝试删除这些行,看看它是否有帮助?我无法想象为什么你需要设置它们并设置ID。你应该只需要做一个或另一个。