在我的系统中,我测试了一些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