2011-01-30 11 views
18

Tengo una base de datos y estoy usando 2 esquemas diferentes. Los esquemas son como espacios de nombres (corrígeme si estoy equivocado). De esta manera tengo 1 db y actualmente 2 esquemas ... para que las tablas en 1 esquema puedan nombrarse igual que las tablas en el otro esquema porque están en esquemas separados.Entity Framework 4: Code First - ¿Crear db en otro esquema? MapSingleType?

¿Cómo obtengo el código EF primero para hablar con un esquema diferente y no con el esquema predeterminado?

¿Tiene algo que ver con MapSingleType y anula un método o puedo hacer otra cosa?

CUALQUIERA ayuda realmente apreciada.

Respuesta

10

se puede implementar el siguiente criterio:

public class DefaultSchemaConvention : 
      IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    string defaultSchema; 
    public DefaultSchemaConvention(string defaultSchema) 
    { 
     if (String.IsNullOrWhiteSpace(defaultSchema)) 
      throw new ArgumentException("defaultSchema"); 
     this.defaultSchema = defaultSchema; 
    } 

    void IConfigurationConvention<Type, EntityTypeConfiguration>.Apply(
     Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     EntityTypeConfiguration cfg = configuration(); 
     string tableName = cfg.EntitySetName; 
     if (String.IsNullOrEmpty(tableName)) 
      tableName = memberInfo.Name; 
     cfg.ToTable(tableName, this.defaultSchema); 
    } 
} 

Uso:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.Edm.Db.ColumnTypeCasingConvention>(); 
    modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST")); 
} 

Hay un par de notas al margen de Arthur Vickers here respecto a TPT herencia y las relaciones de muchos a muchos.

+1

Gracias por su ayuda. – Martin

+4

Lamentablemente, esto ya no funciona, parece que EF 4.1 eliminó 'IConfigurationConvention'. – Omar

+0

Ahora puede anular OnModelCreating en su DbContext y asignar una entidad a una tabla utilizando modelBuilder.Entity (). ToTable ("MyTableName", "MySchemaName"); – hnafar

1

Aquí hay un ejemplo de cómo hacer que los esquemas de tablas de uso de framework de entidad se basen en los espacios de nombres de sus modelos. Por ejemplo, si tiene un modelo RiaLib.Data.Models.Membership.User, la tabla db correspondiente se llamará [Membresía]. [Usuario] en lugar de [dbo]. [Usuario].

public class DatabaseContext : DbContext 
{ 
    public DbSet<Membership.User> Users { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Add(new TableSchemaConvention()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

https://github.com/rialib/efextensions>TableSchemaConvention.cs

7

No sé sobre el modelo CodeFirst, pero el DataAnnotation para "Tabla" incluye una opción de esquema. Mi código lee así:

<Table("Product", Schema:="SalesLT")> 
Public Class Product 

End Class 

Esto ayudó a lidiar con los esquemas alternativas

+0

no, parece que ya no. Ojalá lo hiciera – Kahanu

+0

Gracias! Funciona para EF 5.0. –

Cuestiones relacionadas