2010-11-12 82 views
4

如果爲實體實體做一個通用存儲庫Framework 4中,你會通過查詢實體開始:實體框架4:通用存儲庫:如何確定EntitySetName?

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

...上面我們所需要的EntitySetName,這是通常的E的複數形式名稱。但是,並不總是像添加's'一樣簡單。例如,如果我們只是添加了's',這將起作用。

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

這將包含我們的EntitySetName如果我們有一個真正的實體:

E.EntityKey.EntitySetName 

我怎樣才能獲得EntitySetName當僅供E的類型?

回答

6

這很棘手,特別是涉及代理時,但可能。以下是我如何在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

這太神奇了。非常感謝你。那就是訣竅。 – 2010-11-13 03:28:13