2011-08-15 8 views
0

私が必要なときに自動的に監査証跡テーブルを追加する機能を作ろうとしています。 それは動作しますが、唯一の問題は、監査テーブルが指定したプライマリキーを取得せず、プライマリキーとして以前に指定されたItemIdを保持しているということです。EFコード - 最初の継承と主キーの問題

私はADepartmentのDepartmentを継承しており、最初のEntityTypeConfigurationで主キーを指定しているからです。私はEFがそれを実現するほどスマートだと思うが、それは私が望むものではない。

2番目のEntityTypeConfigurationに、主キーとしてItemIdの使用を停止し、そのためにAuditIdを使用する必要があることを伝える方法はありますか?

public class Item 
    { 
     public int ItemId { get; set;} 
    } 

    public class Department : Item 
    { 
     public string Name { get; set; }   
    } 

    public class ADepartment : Department, IAudit 
    {   
     public int AuditId { get; set; }   
    } 


    EntityTypeConfiguration<Department> cfg = new EntityTypeConfiguration<Department>(); 
    cfg.HasKey(p => p.ItemId); 
    cfg.Map(p => p.MapInheritedProperties());        
    cfg.ToTable(string.Format("Entity{0}", typeof(Department).Name)); 
    model.Configurations.Add<Department>(cfg); 

    EntityTypeConfiguration<ADepartment> c = new EntityTypeConfiguration<ADepartment>(); 
    c.HasKey(p => p.AuditId);   
    c.Map(p => p.MapInheritedProperties()); 
    c.ToTable(string.Format("Audit{0}", typeof(ADepartment).Name));    
    model.Configurations.Add<ADepartment>(c); 

答えて

1

いいえこれを行う方法はありません。継承階層のエンティティは、キープロパティを共有する必要があります。監査レコードに異なるキーが必要な場合は、元のタイプから継承されていない別のエンティティタイプが必要です。監査に継承型を使用すると、多くの問題が発生するため、とにかく行う必要があります。たとえば、

  • すべてのクエリでは、OfType<Department>を使用する必要があります。そうしないと、監査レコードもロードされます。
  • レイジーとDepartmentに関係の積極的なロードはDepartmentADepartmentの両方をロードします - OfType<Department>
+0

おかげで、明示的なロードを使用することを除いてこれを回避する方法はありません。私は両方のタイプが私が監査テーブルで必要なフィールドを実装する必要があるインターフェイスを使用することに決めました。 – Jeroen

関連する問題