2011-11-03 5 views
2

j'ai une classe de base des objets qui sont vérifiés:code première EF relation de type complexe de mappage

AuditableObject

public class AuditableObject : DomainObject, IAuditable 
{ 
    ... some fields 

    public AuditInfo AuditInfo 
    { 
     get; 
     set; 
    } 
} 

AuditInfo

public class AuditInfo : IAuditable 
{ 

    public int CreatedByDbId 
    { 
     get; 
     set; 
    } 

    public DateTime CreatedDate 
    { 
     get; 
     set; 
    } 

    public int? AmendedByDbId 
    { 
     get; 
     set; 
    } 

    public DateTime? AmendedDate 
    { 
     get; 
     set; 
    } 
} 

Le CreatedByDbId et AmendedByDbId sont liés à un objet SystemUser:

SystemUser

public class SystemUser 
{ 
    public int SystemUserDbId 
    { 
     get; 
     set; 
    } 

    public string Username 
    { 
     get; 
     set; 
    } 
} 

J'ai une classe Appel qui hérite de AuditableObject, qui a également d'autres propriétés SystemUser:

public class Call : AuditableObject 
{ 
    ... some fields 

    public SystemUser TakenBy { get; set;} 
    public SystemUser CreatedBy { get; set; } 
    public SystemUser CancelledBy { get; set;} 
    public int CancelledByDbId {get; set;} 
    public int TakenByDbId { get; set;} 
} 

table de base de données d'appel

CREATE TABLE [dbo].[Call](
[CallDbId] [int] IDENTITY(1,1) NOT NULL, 
[CancelledBy] [int] NULL, 
[CreatedByDbId] [int] NOT NULL, 
[CreatedDate] [datetime] NOT NULL, 
[AmendedByDbId] [int] NULL, 
[AmendedDate] [datetime] NULL, 
[TakenBy] [int] NOT NULL) 

Je n'arrive pas à obtenir les bonnes correspondances, par ex.

modelBuilder.ComplexType<AuditInfo>(); 
...// configuration for Call 
this.Property(x => x.AuditInfo.AmendedByDbId).HasColumnName("AmendedByDbId"); 
this.Property(x => x.AuditInfo.AmendedDate).HasColumnName("AmendedDate"); 
this.Property(x => x.AuditInfo.CreatedByDbId).HasColumnName("CreatedByDbId"); 
this.Property(x => x.AuditInfo.CreatedDate).HasColumnName("CreatedDate"); 

this.Property(t => t.CancelledByDbId).HasColumnName("CancelledBy"); 
this.Property(t => t.TakenByDbId).HasColumnName("TakenBy"); 

this.HasRequired(t => t.TakenBy).WithMany().HasForeignKey(x => x.TakenByDbId); 
this.HasRequired(t => t.CancelledBy).WithMany().HasForeignKey(x => x.CancelledByDbId); 

et je reçois toujours des erreurs lors de l'exécution, tels que:

Invalid column name 'SystemUser_SystemUserDbId'. 
Invalid column name 'SystemUser_SystemUserDbId1'. 
Invalid column name 'SystemUser_SystemUserDbId2'. 
Invalid column name 'CreatedBy_SystemUserDbId'. 

Je ne peux pas le comprendre :(

Répondre

0

La dernière erreur "nom de colonne non valide 'CreatedBy_SystemUserDbId'" peut se produire car il manque un mappage de la propriété de navigation CreatedBy à la colonne de clé étrangère CreatedByDbId de la base de données, qui doit ressembler à ceci:

this.HasRequired(t => t.CreatedBy) 
    .WithMany() 
    .Map(c => c.MapKey("CreatedByDbId")); 

Je ne connais pas la raison pour les trois autres erreurs pour le moment.

Modifier

Regardons de plus près j'ai le sentiment que ce modèle sera vraiment difficile ou peut-être impossible de la carte.

  • Vous avez une propriété de navigation CreatedBy sur la classe Call mais la propriété clé étrangère CreatedByDbId sur un type complexe AuditInfo de la classe de base AuditableObject. Je doute que vous pouvez définir dans la cartographie que ces propriétés appartiennent ensemble dans la même relation à SystemUser. Par conséquent, la propriété de navigation CreatedBy doit être dans AuditInfo lorsque la clé étrangère CreatedByDbId est. Mais ce n'est pas possible car vous ne pouvez pas mettre une propriété de navigation dans un type complexe.

  • Est-il nécessaire d'utiliser un type complexe pour AuditInfo?Tu ne peux pas mettre ses propriétés directement dans le AuditableObject:

    public class AuditableObject : DomainObject, IAuditable 
    { 
        ... some fields 
    
        public int CreatedByDbId { get; set; } 
        public DateTime CreatedDate { get; set; } 
        public int? AmendedByDbId { get; set; } 
        public DateTime? AmendedDate { get; set; } 
    } 
    
  • Si vous faites cela, vous devriez être en mesure de déplacer la propriété de navigation CreatedBy de l'entité Call à la classe de base AuditableObject où la vie FK CreatedByDbId puis créer la même cartographie que vous avez déjà fait pour les deux autres propriétés de navigation, mais cette fois pour la classe de base:

    modelBuilder.Entity<AuditableObject>() 
        .HasRequired(a => a.CreatedBy) 
        .WithMany() 
        .HasForeignKey(a => a.CreatedById); 
    
Questions connexes