2010-11-12 5 views
4

Si vous faites un référentiel générique pour une entité dans Entity Framework 4, vous commencez par interroger l'entité:Entity Framework 4: Référentiel générique: Comment déterminer l'EntitySetName?

public IEnumerable<E> GetEntity() 
{ 
    return _container.CreateQuery<E>(...); 
} 

dans ce ... ci-dessus nous avons besoin du EntitySetName, qui est généralement la forme plurielle E « s prénom. Cependant, ce n'est pas toujours aussi simple que d'ajouter un «s». Par exemple, cela fonctionnerait si nous venions juste d'ajouter un 's'.

return _container.CreateQuery<E>("[" + typeof(E).Name + "s]"); 

Cela contiendrait notre EntitySetName si nous avions une véritable entité:

E.EntityKey.EntitySetName 

Comment puis-je obtenir le EntitySetName quand seulement à condition que le type de E?

Répondre

6

C'est compliqué, surtout quand il y a des proxies, mais c'est possible. Voici comment je le fais en Halfpipe:

/// <summary> 
    /// Returns entity set name for a given entity type 
    /// </summary> 
    /// <param name="context">An ObjectContext which defines the entity set for entityType. Must be non-null.</param> 
    /// <param name="entityType">An entity type. Must be non-null and have an entity set defined in the context argument.</param> 
    /// <exception cref="ArgumentException">If entityType is not an entity or has no entity set defined in context.</exception> 
    /// <returns>String name of the entity set.</returns> 
    internal static string GetEntitySetName(this ObjectContext context, Type entityType) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 
     if (entityType == null) 
     { 
      throw new ArgumentNullException("entityType"); 
     } 
     // when POCO proxies are enabled, "entityType" may be a subtype of the mapped type. 
     Type nonProxyEntityType = ObjectContext.GetObjectType(entityType); 
     if (entityType == null) 
     { 
      throw new ArgumentException(
       string.Format(System.Globalization.CultureInfo.CurrentUICulture, 
       Halfpipe.Resource.TypeIsNotAnEntity, 
       entityType.Name)); 
     } 

     var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, System.Data.Metadata.Edm.DataSpace.CSpace); 
     var result = (from entitySet in container.BaseEntitySets 
         where entitySet.ElementType.Name.Equals(nonProxyEntityType.Name) 
         select entitySet.Name).SingleOrDefault(); 
     if (string.IsNullOrEmpty(result)) 
     { 
      throw new ArgumentException(
       string.Format(System.Globalization.CultureInfo.CurrentUICulture, 
       Halfpipe.Resource.TypeIsNotAnEntity, 
       entityType.Name)); 
     } 
     return result; 
    } 
+1

C'est incroyable. Merci beaucoup. Cela a fait l'affaire. –

Questions connexes