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