История в базе данных с использованием сущности - PullRequest
1 голос
/ 14 июля 2011

Я хочу сохранить историю в моей таблице.

У меня есть стол 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 Ответ

2 голосов
/ 14 июля 2011

Он должен просто работать без вызова Modify.Вы загрузили сущность из базы данных и изменили ее поля, пока она присоединена к контексту, поэтому контекст должен знать об изменениях и сохранять их в базе данных.

Что я нахожу абсолютно плохим в вашей архитектуре, так это то, что каждое изменение в вашем сотруднике приводит к активной записи с другим Id.Так что, если вы используете и работаете с таблицей сотрудников, внешние ключи больше не будут указывать на активную запись.Если вы хотите сделать это таким образом, вам не следует создавать новую запись для активной записи, а вместо этого следует создавать новую запись для деактивированной записи.

...