2012-05-25 7 views
5

Tengo una situación en la que puedo estar trabajando con varios DbContexts que pueden contener o no un DbSet de SomeEntity.¿Cómo verificar si DbContext.Set <T> existe en el modelo?

Naturalmente, si I disparar SaveChanges y esta entidad no está presente, se producirá el siguiente error:

La entidad tipo SomeEntity no es parte del modelo para el contexto actual.

¿Cómo puedo comprobar si la entidad o conjunto de entidades existe en un modelo y cortocircuito el bit ofensivo del código si no lo hace?

Richard

Respuesta

10

La excepción debe ser desechado inmediatamente cuando se llama a Set<NotMappedEntityType> lo que la forma más sencilla consiste en detectar la excepción y manejarlo como sea necesario.

La solución compleja requiere que examine los metadatos de la asignación y busque el tipo de entidad asignada que debe tener el mismo nombre que su tipo de CLR. Puede agregar este método en su clase de contexto derivado de comprobar la existencia del tipo de entidad:

public bool Exists<TEntity>() where TEntity : class 
{ 
    string entityName = typeof(TEntity).Name; 
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext; 
    MetadataWorkspace workspace = objContext.MetadataWorkspace; 
    return workspace.GetItems<EntityType>(DataSpace.CSpace).Any(e => e.Name == entityName); 
} 
+1

Gracias. Usé el método proporcionado. Siempre me siento incómodo al usar excepciones en lugares donde sé que hay una excepción. Si eso tiene sentido. – Richard

+0

¿Sigue siendo cierto, cuatro años después? ¿O hay algún método incorporado para verificar esto? –

-2

he utilizado con frecuencia después de la implementación.

(He declarado este método en una interfaz independiente que está siendo implementado por la clase de contexto.)

public bool EntitySetExists<T>(T entity) where T : class 
{ 
    return this.Set<T>().Local.Any(e => e == entity); 
} 

Si en el caso de que vea que se quejan de "Any()" método de extensión simplemente se pega en "using System.Linq;" si falta

+0

Para aclarar mi downvote, esto responde la pregunta incorrecta; la respuesta aceptada es correcta – AlexFoxGill

0

Ésta es mi respuesta simplificada:

public partial class MyDbContext : DbContext 
{ 
    public bool Exists<Tx>() where Tx : class 
    { 
     var attachedEntity = this.ChangeTracker.Entries<Tx>().FirstOrDefault(); 
     return (attachedEntity != null); 
    } 
} 
Cuestiones relacionadas