Чтобы получить имя таблицы базы данных в Entity framework 4.0, я:
ObjectSetInstance.EntitySet.ToString()
Есть ли способ сделать это в Entity Framework 4.1?
Чтобы получить имя таблицы базы данных в Entity framework 4.0, я:
ObjectSetInstance.EntitySet.ToString()
Есть ли способ сделать это в Entity Framework 4.1?
Попробуйте что-то вроде этого:
string name = (context as IObjectContextAdapter).ObjectContext.CreateObjectSet<MyClass>().EntitySet.Name;
Методы расширения для 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: получить сопоставленное имя таблицы из объекта
Вы можете попробовать что-то вроде этого.
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());
Для получения дополнительной информации см. ссылку ниже. Ссылка
Как и в случае EF6.1, решение, рассмотренное в в этой статье, показывает, как использовать вновь открытые метаданные для этого, не требует базы данных, которая должна быть инициализирована или зависит от того, какой метод использовался для установки имени таблицы.
Я также обнаружил, что 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).
Источник: 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));