2011-08-15 52 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