2011-07-14 27 views
1

私のテーブルに履歴を保存したい。エンティティフレームワークを使用したデータベースの履歴

私はテーブルEmployeeを持っています。 Employeeが変更された場合

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

、私は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の場合はどうすればよいですか。

P.S.私はセルフトラッキングエンティティを使用します。

+0

あなたのコードで何が問題になっていますか? –

答えて

2

これは単にModifyを呼び出すことなく動作するはずです。エンティティをデータベースからロードし、フィールドがコンテキストに添付されている間にそのフィールドを変更したので、コンテキストが変更を知ってデータベースに保持する必要があります。

あなたのアーキテクチャーが完全に悪いと感じるのは、従業員が変更されるたびに、別のIdがアクティブな記録になることです。したがって、従業員表を使用して関係を使用している場合、外部キーはアクティブなレコードを指しません。このようにしたい場合、アクティブなレコードの新しいレコードを作成すべきではありませんが、代わりに非アクティブなレコードの新しいレコードを作成する必要があります。

+0

どうすればObjectContextからDetachを使ってレコードを非アクティブにできますか?あなたが従業員のテーブルと関係を使用している場合、それは何を意味しますか?外部キーはそれ以上アクティブなレコードを指しませんでしょうか?答えてくれてありがとう。 –

+0

データベース設計の基礎を理解していますか? Employeeテーブルとの関係を持ち、Employeeテーブルの任意のレコードに外部キーをポイントする他のテーブルがある場合、その外部キーは変更後に非アクティブレコードを指します。 –

+0

私は混乱しています。このエンティティ(または別のフィールドのフィールド部門を変更して従業員レコードを変更しても参照が表示されない場合)は、isActive = falseとしてマークし、古いエンティティをisActive = trueで作成します。私は従業員を変える歴史を保つことができると思います。多分もっと良い解決策があるかもしれません。難しくない場合は、簡単な例を挙げることができます。ありがとうございます –

関連する問題