Подтвердить что ты не робот

Название таблицы DbSet

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

ObjectSetInstance.EntitySet.ToString()

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

4b9b3361

Ответ 1

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

string name = (context as IObjectContextAdapter).ObjectContext.CreateObjectSet<MyClass>().EntitySet.Name;

Ответ 2

Методы расширения для 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: получить сопоставленное имя таблицы из объекта

Ответ 3

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

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());

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

Ответ 5

Я также обнаружил, что 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() - там не хватает шага, который разрешает схему db).

Ответ 6

Источник: 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));