Question

Given the following POCO classes:

public class Certification {
    public int Id { get; set; }
    public virtual ICollection<Employee> CertifiedEmployees { get; set; }
}

public class Employee {
    public int Id { get; set; }
    public virtual ICollection<Certification> Certifications { get; set; }
}

Creating the database model using the EF4 CTP4 code first approach does create the desired junction table:

CREATE TABLE [dbo].[Certifications_CertifiedEmployees](
[Certifications_Id] [int] NOT NULL,
[CertifiedEmployees_Id] [int] NOT NULL,
    ...

However, the table name and the column names are not ideal because they are generated from the associated class property names. I would rather have:

CREATE TABLE [dbo].[Employees_Certifications](
[Employee_Id] [int] NOT NULL,
[Certification_Id] [int] NOT NULL,
    ...

Does anyone know if it is possible to change the generated column names in this scenario, and optionally to also change the table name so that Employees is before Certifications?

Thanks, Gary

Was it helpful?

Solution 2

I used the fluent API to modify the generated junction table:

modelBuilder.Entity<Employee>()
    .HasMany(e => e.Certifications)
    .WithMany(c => c.Employees)
    .Map("Employees_Certifications", (e, c) => new { 
        Employee_Id = e.Id, 
        Certification_Id = c.Id });

OTHER TIPS

Anyone stumbling over this now and using a newer version of EF might need to change the last section @gxclarke answer to:

  .Map(
      m => {
          m.MapLeftKey("Employee_Id");
          m.MapRightKey("Certification_Id");
          m.ToTable("Employees_Certifications");
      }
   );

As it looks as though the method parameters have changed to only accept the action and not the table name.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top