Как получить имя схемы из структуры сущностей?

У меня есть следующий код

using (WdmEntities context = new WdmEntities())
{
    //get object models from context
    ObjectContext objContext = ((IObjectContextAdapter)context).ObjectContext;
    var container = objContext.MetadataWorkspace.GetEntityContainer(objContext.DefaultContainerName, DataSpace.CSpace);
    List<string> schemas = new List<string>();
    foreach (var set in container.BaseEntitySets)
    {
        foreach (var metaproperty in set.MetadataProperties)
        {
            //here 
            if(metaproperty.Name == "Schema")
            {
                //but metaproperty.Value == NULL
                schemas.Add(metaproperty.Value);
            }
        }
    }
}

Я получаю нулевые значения вместо имен схем. Как я могу получить имена схем из структуры сущностей. (У меня в БД две разные схемы.) Может кто знает другой способ?


person isxaker    schedule 03.09.2013    source источник


Ответы (2)


У меня был неправильный подход. В приведенном ниже коде показано, как мне удалось получить название схемы.

using (WdmEntities context = new WdmEntities())
{
    //get object models from context
    ObjectContext objContext = ((IObjectContextAdapter)context).ObjectContext;
    //get all full names types from object model
    var fullNameTypes = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace);
    ///////////////////
    var conStr = objContext.Connection.ConnectionString;
    var connection = new EntityConnection(conStr);
    var workspace = connection.GetMetadataWorkspace();

    var entitySets = workspace.GetItems<EntityContainer>(DataSpace.SSpace).First().BaseEntitySets;

    for (int i = 0; i < fullNameTypes.Count; i++)
    {
        Type type = Type.GetType(fullNameTypes[i].FullName);
        string schema = entitySets[type.Name].MetadataProperties["Schema"].Value.ToString();   
    }
}
person isxaker    schedule 04.09.2013

Попробуйте это. Это хорошо проверено. Дайте мне знать, если возникнут сомнения.

using (var context = new WdmEntities())
                {
                    //get object models from context
                    var objContext = ((IObjectContextAdapter)context).ObjectContext;
                    var items = objContext.MetadataWorkspace.GetItems<EntityContainer>(DataSpace.SSpace);
                    var container = items != null ? items.First() : null;
                    var schemas = new List<string>();
                    if(container != null)
                        schemas = container.BaseEntitySets.Select(set => set.Name).ToList();
                }
person Adarsh Kumar    schedule 03.09.2013
comment
Исключение — пространство «SSpace» не имеет связанной коллекции. - person isxaker; 03.09.2013
comment
@Mikhail, если вы имеете в виду, что «SSpace» не возвращает коллекцию, я бы хотел, чтобы она вернула вам коллекцию, но всегда с одним элементом. Вот почему я использую здесь метод First(). Вы можете назвать это реализацией подхода CodeFirst или дизайном. - person Adarsh Kumar; 04.09.2013