实体框架重复行(C#)

时间:2016-07-15 18:30:30

标签: c# entity-framework

在我的系统中,我测试了一些DAO类,我发现了一个bug。当我从数据库中获取对象并使用其他对象时,EF会复制我的记录。

我的主要代码:

        try
        {
            UsuarioDAO usuarioDAO = new UsuarioDAO();
            BugDAO bugDAO = new BugDAO();
            TipoStatusDAO tipoStatusDAO = new TipoStatusDAO();

            Usuario usuario = usuarioDAO.GetByID(1, true);

            TipoStatus tipoStatus = tipoStatusDAO.GetByID(1, true);

            Bug bug1 = new Bug()
            {
                TipoStatus = tipoStatus,
                Descricao = "Erro ao salvar dados",
                DtAbertura = DateTime.Now,
                Usuario = usuario
            };

            bugDAO.Add(bug1);

            bugDAO.SaveChanges();
            bugDAO.Dispose();
            usuarioDAO.Dispose();                
            tipoStatusDAO.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

UsuarioDAO代码:

    private SGSNIModel database;

    public UsuarioDAO()
    {
        database = DatabaseContextHelper.Context;
    }

    public Usuario GetByID(int id, bool asNoTracking = false)
    {
        try
        {
            if (asNoTracking)
                return database.Usuario.AsNoTracking().FirstOrDefault(x => x.ID == id);
            else
                return database.Usuario.FirstOrDefault(x => x.ID == id);
        }
        catch (Exception ex)
        {
            throw new Exception(String.Format("{0}.{1} -> {2}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name, ex.Message));
        }
    }

    public void Dispose()
    {
        if (database != null)
            database.Dispose();
    }

    public void SaveChanges()
    {
        database.SaveChanges();
    }

DatabaseContextHelper code:

    private static SGSNIModel _context;

    public static SGSNIModel Context
    {
        get
        {
            if (_context == null)
            {
                _context = new SGSNIModel();
            }

            return _context;
        }
    }

我创建Bug对象并设置属性“Usuario”以返回UsuarioDAO,并为“TipoStatus”返回相同内容。

当我保存更改时,EF会复制我数据库中的记录。我用谷歌搜索,建议foud是使用一个上下文,但不工作。

我可以解决这个问题吗?

由于

[编辑]

解决问题:为“asNoTracking”传递false,因为需要跟踪对象。

旧代码:

        Usuario usuario = usuarioDAO.GetByID(1, true);

        TipoStatus tipoStatus = tipoStatusDAO.GetByID(1, true);

新代码:

        Usuario usuario = usuarioDAO.GetByID(1);

        TipoStatus tipoStatus = tipoStatusDAO.GetByID(1);

感谢Ivan Stoev

0 个答案:

没有答案