2011-06-27 7 views
5

je les deux entités suivantes (parmi d'autres, mais ceux-ci me donnent le problème)EF 4.1 Code de première clé étrangère ajoute colonne supplémentaire

public class StartPoint 
{ 
    public int StartPointId { get; set; } 
    public string Description { get; set; } 
    public int StartPointNumber { get; set; }  
    public int StartAreaId { get; set; } 
    public StartArea StartArea { get; set; } 
}  

et

public class StartArea 
{ 
    public int StartAreaId { get; set; } 
    public string Description { get; set; } 
    public ICollection<StartPoint> StartPoints { get; set; } 
} 

Lorsque vous autorisez EF pour créer mon base de données, il s'est plaint que j'avais besoin de désactiver la suppression en cascade à cause de plusieurs chemins, ce que j'ai fait comme suit.

 modelBuilder.Entity<StartPoint>() 
      .HasRequired(x => x.StartArea) 
      .WithMany() 
      .HasForeignKey(x => x.StartAreaId) 
      .WillCascadeOnDelete(false); 

Le problème est, lorsque la base de données est créée, je reçois deux clés étrangères, on est appelé StartAreaId, comme je l'attendre, et l'autre est StartArea_StartAreaId. Seul StartAreaId est en cours d'utilisation. Pourquoi et comment puis-je me débarrasser de StartArea_StartAreaId? Si je supprime HasForeignKey dans le contexte et supprime le StartAreaId de l'entité, j'obtiens plusieurs colonnes StartArea_StartAreaId, comme dans StartArea_StartAreaId et StartArea_StartAreaId1. Que dois-je faire pour empêcher cela de se produire? Je veux juste StartAreaId comme ma clé étrangère.

Répondre

3

Le problème est vide WithMany:

modelBuilder.Entity<StartPoint>() 
     .HasRequired(x => x.StartArea) 
     .WithMany(y => y.StartPoints) 
     .HasForeignKey(x => x.StartAreaId) 
     .WillCascadeOnDelete(false); 
+0

Eh oui, bien sûr, ne sais pas pourquoi je ne pensais pas que cela. Je vous remercie. – Dirk

+1

Merci Ladislav! Bénéficié de vos nombreuses réponses, y compris celle-ci. Seule l'observation est, ce problème est intermittent (mon collègue n'a pas été obligé de fournir quelque chose dans WithMany, mais je devais le faire. (Vous méritez MVP sur EF :)) –

Questions connexes