c# - seguridad - ¿Puedo cambiar el nombre de esquema predeterminado en entity framework 4.3 code-first?
migraciones entity framework (5)
Me gustaría añadir, ya que esto es para C #, he escrito uno a continuación para VB
Public Class ClientDbContext
Inherits DbContext
Public Property Clients As DbSet(Of Client)
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
modelBuilder.HasDefaultSchema("dbo")
End Sub
End Class
Actualmente estoy implementando mi aplicación en un entorno de alojamiento compartido y el código primero con migraciones ha funcionado de maravilla a excepción de un inconveniente menor. Cada vez que quiero presionar el sitio tengo que usar la opción "Actualizar-Base de datos -script" porque tengo que anteponer cada nombre de tabla con [dbo]
porque de forma predeterminada el host compartido crea un nombre de esquema predeterminado que es el mismo nombre que el nombre de usuario
Si inicio sesión en mi host compartido y creo una base de datos, entonces tengo que crear un usuario. Si le pongo un nombre a ese administrador de usuario, las tablas creadas con código primero mientras está conectado como administrador se parecen a esto "[admin]. [BlogPosts]". Cuando la aplicación se ejecuta, se crean todas las tablas, pero recibo una excepción EF porque dice que "[dbo]. [BlogPosts]" no es válido. Si cambio el nombre del esquema de la tabla a "[dbo]" en lugar de "[admin]", eso lo corrige.
Para evitar esto, tengo que generar un script de migraciones para ser ejecutado manualmente y agregar "[dbo]" delante de todos los nombres de tabla porque el script solo hace referencia a las tablas por su nombre, no por su esquema y su nombre.
¿Hay una manera fácil de evitar esto? Sería tan agradable si todo lo que tenía que hacer era publicar la aplicación y todo acaba de funcionar. Si no fuera por la discrepancia en el nombre del esquema, sería una implementación de un clic y todo sería glorioso.
Para aquellos que usan Entity Framework 6, simplemente usen el método HasDefaultSchema
:
public class Contexto : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
}
}
Para las primeras implementaciones de la base de datos, es fácil. Abra el archivo edmx, haga clic con el botón derecho en Propiedades> y establezca el esquema predeterminado de la base de datos.
Para el código primero, este artículo parece más prometedor. http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design
Puede usar el método ToTable
para especificar el nombre del esquema. Si no especifica el nombre del esquema, EF usará dbo
por convención.
public class MyContext
{
private string schemaName = "Foo";
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
}
}
Primero en el Código EF , de manera predeterminada, todo se configura en función del acceso de los usuarios con un acceso administrativo " DBO-Schema " en el Servidor SQL. Pero si un usuario específico está definido para trabajar con una base de datos que es común en el alojamiento compartido, entonces ya no habrá acceso a la administración de Dbo. Esta vez, los nombres de nuestras tablas son dbo.tableName, por ejemplo, someUser.tableName, y la inexactitud de este punto hace que sea imposible ejecutar el programa. Para modificar y asignar explícitamente a un usuario conectado a una base de datos. Si usa metadatos, se debe usar el siguiente método :
[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
//Other Lines...
}
O bien (si la API Fluent es personalizable de la siguiente manera :)
modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");
una buena referencia para el estudio: http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/