История в базе данных с использованием структуры объекта
Я хочу сохранить историю в моей таблице.
У меня есть стол 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
объект.
PS Я использую Self-Tracking Entities.
1 ответ
Это должно просто работать без вызова каких-либо Modify
, Вы загрузили сущность из базы данных и изменили ее поля, когда она присоединена к контексту, поэтому контекст должен знать об изменениях и сохранять их в базе данных.
Что я нахожу абсолютно плохим в вашей архитектуре, так это то, что каждое изменение в вашем сотруднике приводит к активной записи с другим Id
, Так что, если вы используете и работаете с таблицей сотрудников, внешние ключи больше не будут указывать на активную запись. Если вы хотите сделать это таким образом, вам не следует создавать новую запись для активной записи, а вместо этого следует создавать новую запись для деактивированной записи.