2011-08-31 3 views
1

J'ai recherché les questions déjà répondues mais je n'ai trouvé aucune réponse à mon problème. Honte sur moi.Code EF - Première clé composite de "Navigation"

J'ai cette situation:

public class Content 
{ 
    [Key] 
    [StringLength(36, ErrorMessage="Must have 36 characters")] 
    [Required(ErrorMessage="Must have a unique GUID")] 
    public string GUID { get; set; } 

    public virtual ICollection<RegionalInfo> RegionalInfo { get; set; } 
} 

public class RegionalInfo 
{ 
    [Key] 
    public virtual Content Content { get; set; } 

    [Key] 
    public virtual Region Region { get; set; } 
} 

public class Region 
{ 
    [Key] 
    [StringLength(5, ErrorMessage="ID must have 5 characters")] 
    [Required] 
    [RegularExpression(@"[a-z]{2}-[A-Z]{2}", ErrorMessage = "ID must be in ISO 639 standard")] 
    public string ID { get; set; } 

    public string Country { get; set; } 

    public string Language { get; set; } 
} 

Mais je ne peux pas obtenir ce travail. EF indique que "RegionalInfo n'a pas de clé définie". Pour être bref, j'essaye de faire une clé composée sur cette classe "RegionalInfo" qui inclut le Content.GUID et le Region.ID.

Pour chaque contenu UNIQUE unique de la table Contents, de nombreuses "Traductions" existeront dans la table RegionalInfo.

Répondre

2

Je fais l'hypothèse que vous utilisez un DbContext. Sous cette hypothèse, vous devez définir vos clés dans la classe RegionalInfo comme si

public class RegionalInfo 
{ 
    [Key] 
    public String ContentId { get; set; } 
    public virtual Content Content { get; set; } 

    [Key] 
    public string RegionId { get; set; } 
    public virtual Region Region { get; set; } 
} 

et dans votre classe de contexte que vous effectuez les opérations suivantes:

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    { 
     // Composite key definition 
     modelBuilder.Entity<RegionalInfo>().HasKey(x => new { x.ContentId, x.RegionId }); 
     // And if I remember correctly this was required in order to do 
     // var x = contentObject.RegionalInfo.Where(....) stuff 
     modelBuilder.Entity<RegionalInfo>().HasRequired<Content>(x => x.Content).WithMany(x => x.RegionalInfo).HasForeignKey(x => x.ContentId); 
    } 

Cela devrait faire l'affaire

+0

Est-ce code sur la classe de contexte nécessaire pour que la clé composite fonctionne? Cela évitera-t-il la vérification unique sur une seule colonne qui intègre la clé composite et ne vérifie que les deux colonnes? – programad

+0

En ce qui concerne votre première question, j'ai essayé moi-même hier: pour le HasKey() c'était nécessaire dans mon cas. Sans cela, j'ai toujours l'exception "RegionalInfo n'a pas de clé définie". La ligne HasRequired() dont je ne suis vraiment pas sûre. J'ai copié cela à partir d'une situation similaire que j'ai aussi (une entité Image, une entité Gallery et une entité ImageGallery où Gallery détient une collection d'images). En ce qui concerne votre deuxième question, dans la table RegionalInfo, une clé primaire sera générée, comprenant à la fois ContentId et RegionId, de sorte que combo est unique, pas une seule colonne. –

Questions connexes