Entity Framework 4: универсальный репозиторий: как определить EntitySetName? - PullRequest
4 голосов
/ 12 ноября 2010

Если вы создадите общий репозиторий для Entity в Entity Framework 4, вы начнете с запроса сущности:

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?

1 Ответ

6 голосов
/ 12 ноября 2010

Это сложно, особенно когда задействованы прокси, но возможно. Вот как я это делаю в 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...