update framework entity-framework dbcontext db-schema

entity-framework - update - entity framework schema



Usando Entity Framework 6 con mĂșltiples esquemas de base de datos pero usando One DBContext (3)

Tengo una aplicación que utiliza EF como ORM. La base de datos solía tener un esquema, dbo y todo funcionaba bien. Recientemente organicé mis tablas en 4 esquemas diferentes. Algunas tablas de un esquema tienen dependencias en tablas que residen en un esquema diferente. Todo parece ser válido en el lado de SQL.

En el lado de la aplicación, todas las interacciones de db a través de EF ya no funcionan. El código se compila, los esquemas son visibles en la solución, las asignaciones del modelo apuntan a los esquemas correctos, pero una vez que trato de insertar una fila en una tabla no funciona.

He visto que algunas publicaciones sobre el uso de múltiples esquemas requerirán el uso de múltiples DBContexts pero preferiría usar un DBContext. Todos mis esquemas tienen el mismo dbo de propietario y no veo una razón para usar múltiples DBContexts.

¿Alguien sabe si hay una manera de lograr esto?


@GertArnold es acertado con su respuesta. Sin embargo, para los dulces sintácticos puros, también puede hacer esto a través de una convención para extraer el esquema del espacio de nombres de sus modelos. Encontramos este útil tratar con múltiples esquemas

modelBuilder.Types().Configure(e => { var schema = e.ClrType.Namespace.Split(''.'').Last().ToLower(); var name = entity.ClrType.Name; return entity.ToTable(name, schema); });

lo anterior tomará el componente final del espacio de nombres y lo usará como el nombre del esquema. Esto evita la necesidad de personalizar el enlace de la tabla para cada entidad.


Además de la respuesta de Gert Arnold, también puede usar el atributo Tabla en su entidad:

using System.ComponentModel.DataAnnotations.Schema; [Table("t_Department", Schema = "school")] public class Department { public int Id { get; set; } public string Name { get; set; } }


Puede asignar cada tabla a su propio esquema solo mediante la asignación fluida. En tu subtipo DbContext deberías anular OnModelCreating (si aún no lo has hecho) y agregar declaraciones como esta:

modelBuilder.Entity<Department>() .ToTable("t_Department", "school");

Las entidades que no asigna así explícitamente se dbo esquema dbo predeterminado, o puede proporcionar su propio valor predeterminado al

modelBuilder.HasDefaultSchema("sales");

(resumido de here )