2010-12-28 4 views
1

je le modèle suivant et configuration:propriétés de navigation de code Première CTP5 génère des noms de mauvaise colonne

public class User 
{ 
    public int Id { get; set; } 
    public User CreatedBy { get; set; } 
    public DateTime? DateCreated { get; set; } 
    public string Name { get; set; } 
    public string Username { get; set; } 
} 

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     this.HasKey(t => t.Id); 

     this.HasOptional(u => u.CreatedBy); 
     this.Property(u => u.DateCreated); 

     this.Property(u => u.Name).HasMaxLength(64); 
     this.Property(u => u.Username).HasMaxLength(64); 
    } 
} 

public class SampleContext : DbContext 
{ 

    public IDbSet<User> Users { get; set; } 

    public SampleContext(string dbConnection) 
     : base(dbConnection) 
    { 

    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new UserConfiguration()); 
    } 
} 

Je peux travailler avec le contexte et ajouter des utilisateurs très bien. J'ai ensuite regardé la table générée par Code First et j'ai réalisé que la propriété CreatedBy ne génère pas de colonne CreatedById mais plutôt une colonne UserId. Si j'ajoute une autre propriété, comme ModifiedBy il va générer UserId1 et ainsi de suite:

alt text

J'ai essayé la cartographie avec HasRequired() ainsi, mais la propriété génère toujours un nom de colonne qui correspond au type réel et pas la nom de la propriété. Toute aide serait appréciée.

Répondre

1

Vous voulez essentiellement de créer une association indépendante autoréférence avec un nom de colonne de clé étrangère sur mesure et est ici le code API couramment pour ce faire:

public UserConfiguration() 
{ 
    this.HasRequired(u => u.CreatedBy) 
     .WithMany() 
     .IsIndependent() 
     .Map(m => 
     { 
      m.MapKey(u => u.Id, "CreatedById"); 
     }); 
} 

Toutefois, ce code génère une exception en raison d'un bogue dans CTP5. Par conséquent, pour l'instant, vous pouvez utiliser la solution de contournement suggérée dans le forum MSDN (modification de votre association indépendante à l'association FK et nommer explicitement votre propriété FK) et enregistrer ce code pour le RTM l'année prochaine.

+0

+1 Génial à savoir! Je pense toujours que cela devrait être la convention de nommage * default *. Il semble qu'il y ait des problèmes comme le support de no * true * enum, ne permettant pas les configurations par héritage (voir l'un de mes messages sur MSDN), etc. Je vais enregistrer cela pour RTM! Merci :) – TheCloudlessSky

+0

Pas de problème :) BTW, je ne pouvais pas trouver votre fil à propos de "configurations par héritage" pouvez-vous s'il vous plaît me fournir le lien? –

+0

Voici le fil: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/ebe48aa3-14df-475e-bc5e-80734f85ace4 – TheCloudlessSky

0

Je crois posted this on the MSDN forums et je suppose que c'est, à ce jour, par conception. Toutes les propriétés de navigation génèrent le nom de type + Id pour le nom de la colonne. Pour moi, c'est un défaut de conception fondamental dans le code d'abord. Les noms générés ne reflètent même pas la colonne (sauf que c'est un utilisateur).

+0

Non, ce n'est pas un défaut de conception, s'il vous plaît lire ma réponse :) –

0

Vous pouvez passer outre les noms de colonnes par défaut à l'aide HasColumnName (...)

public class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     this.HasKey(t => t.Id); 

     this.HasOptional(u => u.CreatedBy); 
     // Map the 'DateCreated' Property to the 'CreatedById' table field. 
     this.Property(u => u.DateCreated).HasColumnName("CreatedById"); 

     this.Property(u => u.Name).HasMaxLength(64); 
     this.Property(u => u.Username).HasMaxLength(64); 
    } 
} 
+0

Pourquoi devrais-je mapper 'DateCreated' à l '* Id * de' CreatedBy'? Cela n'a aucun sens. 'HasColumnName' est seulement disponible sur les propriétés non-navigationnelles. – TheCloudlessSky

+0

Désolé à ce sujet. Mon erreur. J'ai mal lu votre question complètement. –

+0

Pas de soucis :). J'espérais avoir le 'HasColumnName' aussi, mais si vous regardez le MSDN comme dans mon post, vous verrez qu'il n'est même pas possible de contrôler les noms des propriétés de navigation. – TheCloudlessSky

Questions connexes