2011-08-15 5 views
0

J'essaie de créer une fonction qui ajoute automatiquement une table de vérification lorsque j'en ai besoin. Cela fonctionne en quelque sorte mais le seul problème est que la table d'audit n'obtient pas la clé primaire que j'ai spécifiée, elle reste sur l'élément ItemId spécifié précédemment comme clé primaire. C'est parce que j'hérite Department dans ADepartment et que j'ai déjà spécifié une clé primaire dans la première EntityTypeConfiguration. Je suppose que l'EF est assez intelligent pour réaliser cela mais ce n'est pas ce que je veux.Code EF-Premier héritage et problème de clé primaire

Est-il possible de dire à la deuxième EntityTypeConfiguration qu'elle doit cesser d'utiliser ItemId comme clé primaire et commencer à utiliser AuditId pour cela?

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); 

Répondre

1

Non, il n'y a aucun moyen de le faire. Les entités dans la hiérarchie d'héritage doivent partager une propriété clé. Si vous voulez une clé différente pour votre enregistrement d'audit, vous avez besoin d'un type d'entité différent qui n'est pas hérité du type d'origine. Utiliser le type hérité pour l'audit vous causera beaucoup de problèmes, alors vous devriez le faire quand même. Par exemple:

  • Chaque requête devra utiliser OfType<Department> sinon vous chargerez également des enregistrements d'audit.
  • Lazy et désireux de chargement des relations à la fois Department chargera Department et ADepartment - il n'y a aucun moyen d'éviter cela, sauf en utilisant le chargement explicite avec OfType<Department>
+0

Merci. J'ai décidé d'utiliser une interface que les deux types doivent mettre en œuvre avec les champs que je veux dans la table d'audit. – Jeroen

Questions connexes