【问题标题】:History in database using entity framework使用实体框架在数据库中的历史
【发布时间】:2011-07-14 06:32:07
【问题描述】:

我想在我的表中存储历史记录。

我有桌子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 并且还希望在此表中存储历史记录,我需要做什么。如果在Employee 对象中更改Department,我该怎么办。

附:我使用自我跟踪实体。

【问题讨论】:

  • 你的代码有什么问题?

标签: entity-framework self-tracking-entities


【解决方案1】:

它应该可以简单地工作而无需调用任何Modify。您从数据库中加载了实体,并在它附加到上下文时修改了它的字段,因此上下文应该知道更改并将它们保存到数据库中。

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

【讨论】:

  • 那么如何使用 Detach from ObjectContext 停用记录? '如果您正在使用和与员工表建立关系,外键将不再指向活动记录'是什么意思?谢谢你的回答。
  • 你了解数据库设计的基础知识吗?如果您有其他表与您的 Employee 表有关系并将外键指向您的 Employee 表中的任何记录,则该外键将指向您更改后停用的记录。
  • Im confused. If i change employee record by changing field department in this entity (or another field, i dont 查看任何参考资料)我想将 old 实体标记为 isActive=false 并使用 isActive=true 创建新的实体员工。我想这样我就可以留住一个改变历史的员工。也许有更好的解决方案。你可以举一个简单的例子,如果不难的话。谢谢
猜你喜欢
  • 2011-09-29
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2010-11-30
  • 2013-06-05
相关资源
最近更新 更多