Получить имя EntitySet из EntityType в EF - PullRequest
14 голосов
/ 22 апреля 2010

Учитывая EntityType, такой как «Контакт», как я могу извлечь из него имя EntitySet, к которому он будет принадлежать, то есть множественное число, такое как «Контакты»?

Ответы [ 3 ]

32 голосов
/ 22 апреля 2010

Если у вас уже есть присоединенный объект (очевидно, вам не нужна первая строка, просто используйте существующий объект):

  Contact c = context.Contacts.Where(x => x.blah).FirstOrDefault();
  string setName = c.EntityKey.EntitySetName;

Или, если вы этого не сделаете:

 string className = typeof(Contact).Name
 var container =   
    context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
    string setName = (from meta in container.BaseEntitySets
                                          where meta.ElementType.Name == className
                                          select meta.Name).First();
6 голосов
/ 27 ноября 2013

Это расширение может быть полезным

public static class MyExtensions
{
    public static string GetEntitySetName<T>(this ObjectContext context)
    {
        string className = typeof(T).Name;

        var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
        string entitySetName = (from meta in container.BaseEntitySets
                                where meta.ElementType.Name == className
                                select meta.Name).First();

        return entitySetName;
    }
}

И использовать его как:

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance);
0 голосов
/ 15 февраля 2019

Вот метод, который работает аналогично принятому ответу, за исключением того, что он поддерживает a) типы прокси (например, если вы динамически получаете тип сущности EF6, он может иметь тип "Contact_1A2B3C4D5E")вместо «Контакт») и б) наследование (таблица на тип, таблица на иерархию).

private static string GetEntitySetName(ObjectContext objectContext, Type type)
{
    if (objectContext == null) throw new ArgumentNullException(nameof(objectContext));
    if (type == null) throw new ArgumentNullException(nameof(type));

    EntityContainer container = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);

    return container.BaseEntitySets
        .Where(x =>
            (x.ElementType.Name == type.Name) ||
            (x.ElementType.Name == type.BaseType?.Name) ||
            (x.ElementType.Name == type.BaseType?.BaseType?.Name)
        )
        .Select(x => x.Name)
        .FirstOrDefault() ?? throw new ArgumentException($"Specified type is not an entity type.", nameof(type));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...