2011-05-04 26 views
5

Esta es mi situación, muy simplificada.Cambiar la columna discriminator a int en Entity Framework 4.1

Mis clases;

public class ClassBase 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

public class ClassMiddle1 : ClassBase 
{ 

} 

public class ClassMiddle2 : ClassBase 
{ 
    public Guid Token { get; set; } 
} 

public class ClassA : ClassMiddle1 
{ 
    public string UserId { get; set; } 
    public string Username { get; set; } 
} 

public class ClassB : ClassMiddle2 
{ 
    public string Username { get; set; } 
} 

Y mi OnModelCreating;

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      m.Properties(p => new { p.Id}); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle1>() 
     .Map<ClassMiddle1>(m => 
     { 
      m.Properties(p => new { }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle2>() 
     .Map<ClassMiddle2>(m => 
     { 
      m.Properties(p => new { p.Token }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassA>() 
     .Map<ClassA>(m => 
     { 
      m.Properties(p => new 
      { 
       p.UserId, 
       p.Username 
      }); 
      m.ToTable("TableA"); 

     }); 

    modelBuilder.Entity<ClassB>() 
     .Map<ClassB>(m => 
     { 
      m.Properties(p => new 
      { 
       p.Username 
      }); 
      m.ToTable("TableB"); 

     }).Property(p => p.Username).HasColumnName("User"); 

} 

Esto funciona bien, pero la columna discriminadora es por defecto discriminador, nvarchar (128). Leí que es posible definir esta columna yo mismo usando algo como a continuación.

m.Requires("ClassType").HasValue(1); 

Volví a dar vueltas a mis posibilidades, pero a todas luces me encontré con un callejón sin salida. ¿Alguien tiene una sugerencia de cómo hacerlo?

Terminaré con otra pregunta. Como nuestra jerarquía es bastante parecida a la anterior, pero aún hay más clases derivadas como C, D, E, F y ... digamos P. Descubrimos que EF está haciendo esta consulta de base de datos increíblemente grande (~ 150K). ¿Alguien más se encontró con este escenario?

Tengo la esperanza de cambiar Discriminator para al menos minimizar esto. Por eso digo que tenemos una jerarquía de clases muy ordenada pero un conjunto de consultas feo.

Respuesta

5

respuesta tardía cómo fue la solución real. Solo escribiéndolo aquí porque la documentación sobre esto no fue tan fácil de encontrar.

Mi solución terminó, como a continuación ...

modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      ... 
      m.Requires("Discriminator").HasValue(1) 
     }); 
1

En cuanto a su "consulta de base de datos increíblemente grande": De hecho, hay performance and query generation issues with TPT inheritance mapping. Parece que no hay todavía ser una solución para estos problemas, sólo que esta vaga anuncio (Agosto 2010):

La buena noticia es que estamos trabajando en estos temas por lo que EF no genera SQL innecesaria . La mala noticia de es que llevará algún tiempo antes de que la corrección se entregue en una futura versión .

(Cita del artículo enlazado más arriba.)

Cuestiones relacionadas