使用实体框架的数据库历史

时间:2011-07-14 06:32:07

标签: entity-framework self-tracking-entities

我想将历史存储在我的表格中。

我有表Employee

Employee
{
    [Id],
    [name],    
    [phone],    
    [isActive],    
    [createdDate],     
    [closedDate](default '23:59:59 9999-12-31'),     
    [DepartmentId] References Department(id)    
}

更改Employee后,我会按Id检索原始值并执行isActive=False, closedDate=DateTime.Now,然后将修改后的值保存为具有修改后原始值的新Employee

void UpdateEmployee(Employee employee)
{
    ContextDB db=new ContextDB();
    var employeeToUpdate=db.Employees.Find(it=>it.Id==employee.Id);
    employeeToUpdate.isActive=false;
    employeeToUpdate.closeDate=DateTime.Now;
    var newEmployee=new Employee
    {
        Name=employee.Name,
        Phone=employee.Phone,
        .... 
    }

    db.Employees.AddObject(newEmployee);

    // How I can do this with EF
    db.Employees.Modify(employeeToUpdate);

    db.SaveChanges();
}

我该怎么做?还有一个问题,如果我引用另一个表Department并且还想在此表中存储历史记录,我需要做什么。如果在Department对象中更改Employee,我该怎么办?

P.S。我使用自我跟踪实体。

1 个答案:

答案 0 :(得分:2)

它应该可以在不调用任何Modify的情况下工作。您从数据库加载了实体,并在将其附加到上下文时修改了其字段,以便上下文了解更改并将其保留到数据库中。

我发现您的架构完全不好的是,对员工的每次更改都会导致另一个Id的活动记录。因此,如果您正在使用与employee表的关系,则外键将不再指向活动记录。如果你想这样做,你不应该为活动记录创建一个新记录,而是应该为停用记录创建一个新记录。