2011-08-15 89 views
0

我試圖做一個函數,當我需要時自動添加審計跟蹤表。 這是一種有效的工作,但唯一的問題是審計表沒有得到我指定的主鍵,它保留了以前指定的ItemId作爲主鍵。EF代碼 - 第一繼承和主鍵問題

這是因爲我繼承了ADepartment中的Department,並且已經在第一個EntityTypeConfiguration中指定了一個主鍵。我猜EF足夠聰明,可以實現,但這不是我想要的。

有沒有一種方法可以告訴第二個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