Имя таблицы DbSet - PullRequest
       3

Имя таблицы DbSet

15 голосов
/ 06 июля 2011

Чтобы получить имя таблицы базы данных в Entity Framework 4.0, я делаю:

ObjectSetInstance.EntitySet.ToString()

Есть ли способ сделать это в Entity Framework 4.1?

Ответы [ 6 ]

24 голосов
/ 19 марта 2012

Методы расширения для DbContext и ObjectContext :

public static class ContextExtensions
{
    public static string GetTableName<T>(this DbContext context) where T : class
    {
        ObjectContext objectContext = ((IObjectContextAdapter) context).ObjectContext;

        return objectContext.GetTableName<T>();
    }

    public static string GetTableName<T>(this ObjectContext context) where T : class
    {
        string sql = context.CreateObjectSet<T>().ToTraceString();
        Regex regex = new Regex("FROM (?<table>.*) AS");
        Match match = regex.Match(sql);

        string table = match.Groups["table"].Value;
        return table;
    }
}

Использование объекта ObjectContext:

ObjectContext context = ....;
string table = context.GetTableName<Foo>();

Использование объекта DbContext:

DbContext context = ....;
string table = context.GetTableName<Foo>();

Подробнее здесь:

Entity Framework: получить имя сопоставленной таблицы от объекта

5 голосов
/ 11 апреля 2015

Начиная с EF6.1, решение, рассмотренное в этой статье , показывает, как использовать недавно открытые метаданные для достижения этой цели, не должно требовать инициализации базы данных или зависеть от того, какой метод использовался для установки имя таблицы.

4 голосов
/ 08 июля 2011

Попробуйте что-то вроде этого:

string name = (context as IObjectContextAdapter).ObjectContext.CreateObjectSet<MyClass>().EntitySet.Name;
3 голосов
/ 06 июля 2011

Вы можете попробовать что-то вроде этого.

private string GetTableName(Type type)
{
  var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault();
  return tableAttribute == null ? type.Name : tableAttribute.Name;
}

Вы можете назвать эту строку следующим образом.

var tableName = GetTableName(entityType.FirstOrDefault());

Пожалуйста, смотрите ссылку ниже для получения дополнительной информации. Ссылка

1 голос
/ 23 марта 2015

Источник: https://msdn.microsoft.com/en-gb/data/jj819164.aspx

using System.Data.Entity;
using System.Data.Entity.Infrastructure.DependencyResolution;
using System.Data.Entity.Infrastructure.Pluralization;

var service = DbConfiguration.DependencyResolver.GetService<IPluralizationService>();
var entitySetName = service.Pluralize(typeof(TEntity).Name));
1 голос
/ 11 декабря 2012

Я также обнаружил, что CreateObjectSet () не совсем справляется с этой задачей, особенно при получении имен столбцов для использования в SqlBulCopy ().Следующий код для получения EntitySet, кажется, работает лучше:

 private EntitySet GetEntitySet<T>(DbContext context)
{
    var type = typeof(T);
    var entityName = type.Name;
    var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;

    IEnumerable<EntitySet> entitySets;
    entitySets = metadata.GetItemCollection(DataSpace.SSpace)
                     .GetItems<EntityContainer>()
                     .Single()
                     .BaseEntitySets
                     .OfType<EntitySet>()
                     .Where(s => !s.MetadataProperties.Contains("Type")
                                 || s.MetadataProperties["Type"].ToString() == "Tables");
    var entitySet = entitySets.FirstOrDefault(t => t.Name == entityName);
    return entitySet;
}

Чтобы получить имя таблицы, есть два других метода, которые я использую вместо EntitySet.Name , который возвращает единственное, а немножественное имя.

public string GetTableName<T>(DbContext context)
            where T: class
{
    var entitySet= GetEntitySet<T>(context);
    if (entitySet == null)
        throw new Exception("Unable to find entity set '{0}' in edm metadata".F(typeof(T).Name));
    var tableName = GetStringProperty(entitySet, "Schema") + "." + GetStringProperty(entitySet, "Table");
    return tableName;
}

private string GetStringProperty(MetadataItem entitySet, string propertyName)
{
    MetadataProperty property;
    if (entitySet == null)
        throw new ArgumentNullException("entitySet");
    if (entitySet.MetadataProperties.TryGetValue(propertyName, false, out property))
    {
        string str = null;
        if (((property != null) &&
            (property.Value != null)) &&
            (((str = property.Value as string) != null) &&
            !string.IsNullOrEmpty(str)))
        {
            return str;
        }
    }
    return string.Empty;
}

Возвращает фактическое имя, используемое в базе данных, а также схему db (если вы не используете dbo), и должно работать с аннотациями данных или быстрой конфигурацией.

Единственное предостережение может заключаться в том, что база данных уже должна быть инициализирована.(я думаю, это проблема с использованием CreateObjectSet () - отсутствует шаг, который разрешает схему БД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...