2011-06-14 5 views
3

J'ai deux classes, ThreadItem et Inquiry.CodeFirst EF 4.1 Héritage - Renommer PK/FK

public class ThreadItem 
{ 
    [Key] 
    public int Id { get; set; } 

    public DateTime Created { get; set; } 
} 

public class ThreadItemMapping : EntityTypeConfiguration<ThreadItem> 
{ 
    public ThreadItemMapping() 
    { 
     Property(a => a.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnName("ThreadItemId"); 
    } 
} 

[Table("Enquiry")] 
public class Enquiry : ThreadItem 
{ 
    public string Comment { get; set;} 
} 

Maintenant, cela fonctionne, pas un seul problème. J'ai une table [ThreadItem] et une table [Inquiry]. Ma table Inquiry a un PK/FK qui est mappé sur ThreadItem, ce dont j'ai besoin. Cependant, je voudrais renommer la colonne.

Actuellement, il s'agit de [ThreadItemId], conformément à la classe ThreadItemMapping. Je voudrais le renommer [EnquiryId]. Je comprends que cela s'appelle [ThreadItemId] est logique, c'est plus une question «est-ce possible» pour être honnête.

Des idées?

Cheers, D

+0

Question intéressante! EF 4.0 prend en charge le mappage d'un nom de colonne arbitraire à la propriété key de la classe de base dans l'héritage Table-Per-Type. (Vous pouvez même mapper cela dans le concepteur.) Mais il semble que l'API DbContext n'a aucune option pour configurer ce scénario. Les noms de colonnes clés doivent être identiques dans la base et toutes les classes dérivées. Pour autant que je puisse voir au moins ... – Slauma

Répondre

2

http://msdn.microsoft.com/en-us/library/gg197525%28v=vs.103%29.aspx

Je ne dis pas qu'il ne peut pas être fait, mais ces exemples ne montrent pas une telle chose se fait.

Si vous utilisez les conventions API-Fluent, cependant, c'est assez simple.

Vos définitions POCO:

public class BaseClass 
{ 
    public int Id {get; set;} 
} 

public class DerivedClass : BaseClass 
{ 
    public string Data {get; set;} 
} 

Configuration des applications à la DB:

public class BaseConfiguration : EntityTypeConfiguration<BaseClass> 
{ 
    public BaseConfiguration() 
{ 
    HasKey(k => k.Id); 
    Property(p => p.Id).HasColumnName("Id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired(); 
} 
} 

public class DerivedConfiguration : BaseConfiguration 
{ 
    public DerivedConfiguration() 
{ 
    Property(p => p.Id).HasColumnName("BaseClassId"); 
} 
} 

mettre tous ensemble

public class MyContext : DbContext 
{ 
    public MyContext(string connectionString) : base(connectionString) 
{ 
    Database.SetInitializer<MyContext>(null); 
} 

public DbSet<BaseClass> Bases { get; set; } 
public DbSet<DerivedClass> Deriveds { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new BaseConfiguration()); 
    modelBuilder.Configurations.Add(new DerivedConfiguration()); 
} 
} 

Vous instancier un MyContext qui passe dans votre chaîne de connexion et les configurations indiquent à EF comment se rapporter aux tables.

+0

Hmmm, pas tout à fait ce que je veux, je veux renommer la colonne pour la table Inquiry seulement, il y aura plus de classes que d'hériter de ThreadItem. –

+0

Désolé, vous avez raison, je me suis trompé de table - mais le principe est le même. –

+0

Hmm. Tu sais que je suis meilleur avec les configurations. Dans une configuration de fichier de configuration (que je crois plus robuste), vous utiliseriez Property (p => ThreadItemId = p.Id); pour remplacer le nom de la colonne. –

Questions connexes