Si es necesario comprobar la existencia de la tabla que debe llamar a código SQL personalizada:
bool exists = context.Database
.SqlQuery<int?>(@"
SELECT 1 FROM sys.tables AS T
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id
WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'")
.SingleOrDefault() != null;
Nombre de la tabla se define por defecto como el nombre de DbSet
expuesta en su contexto derivado pero el nombre por defecto puede ser anulado ya sea por el método fluido de la API ToTable
o la anotación de datos Table
.
Hacer esto de forma genérica no es algo que se suponga en el primer enfoque del código. Esto requerirá examinar los metadatos y explorar manualmente a qué tabla está asignada la entidad; esto puede ser bastante complejo porque la entidad se puede mapear en varias tablas. El código primero no ofrece acceso a los metadatos. Debe convertir DbContext
en ObjectContext
y examinar MetadataWorkspace
.
Editar:
Para convertir DbContext
-ObjectContext
uso esto:
ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
¿Cómo puedo convertir DbContext en ObjectContext? He buscado diferentes enfoques para verificar la existencia de una tabla. ¿Hay alguna diferencia entre su solución y a) SELECCIONE * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' Y TABLE_NAME = 'TheTable')) ob) SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N '[dbo] . [TableName] ') Y escriba in (N'U')? ¿Podría explicar las ventajas/desventajas? Preferiría usar una forma de conformidad más estándar. – 0xbadf00d
En general, todas estas selecciones SQL consultan la misma información; esa es solo una manera diferente de obtener el mismo resultado. –
¿Qué significa tipo (N'U ')? Su versión ignora el esquema de la tabla, ¿verdad? – 0xbadf00d