c# - primary - Entity Framework 4: Code First-¿Crear db en otro esquema? ¿MapSingleType?
modelbuilder entity framework (3)
Este es un ejemplo de cómo hacer que el marco de la entidad use esquemas de tablas basados 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á [Membership]. [User] en lugar de [dbo]. [User].
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
Tengo una base de datos y estoy usando 2 esquemas diferentes. Los esquemas son como espacios de nombres (corríjame si me equivoco). De esta manera tengo 1 db y actualmente 2 esquemas ... así que las tablas en 1 esquema pueden tener el mismo nombre que las tablas en el otro esquema porque están en esquemas separados.
¿Cómo obtengo el código EF primero para hablar con un esquema diferente y no con el esquema predeterminado?
¿Es algo que ver con MapSingleType y reemplazar un método o puedo hacer otra cosa?
Cualquier ayuda realmente apreciada.
No sé acerca del modelo CodeFirst, pero la Anotación de datos para "Tabla" incluye una opción de esquema. Mi código se lee así:
<Table("Product", Schema:="SalesLT")>
Public Class Product
End Class
Esto me ayudó a lidiar con esquemas alternativos
Puede implementar la siguiente convención:
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 laterales de Arthur Vickers here relacionadas con la herencia de TPT y las relaciones de muchos a muchos.