Как получить имя схемы объекта, используя Code First (Entity Framework) и DbContext? - PullRequest
4 голосов
/ 24 февраля 2012

Наша база данных была разработана таким образом, что существуют различные схемы для производства и различные эквивалентные схемы для тестирования.Например, многие таблицы хранятся в схеме MyProduction, в то время как те же таблицы находятся в схеме MyTest.

Что я хочу сделать, это определить, какую схему использует таблица, поэтому я знаю, какую из них изменить.Так что по умолчанию все будет по производственным схемам.В событии OnModelCreating объекта DbContext, если мне нужно указать на тест (определяемый некоторой истинной / ложной конфигурацией), мне нужно определить используемую производственную схему, а затем указать на ее эквивалент теста.

Я уже знаю, как настроить схему, но не могу найти, как ее получить.Любые идеи, как я могу определить схему, которую использует таблица?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 июля 2013
System.ComponentModel.DataAnnotations.Schema.TableAttribute
0 голосов
/ 03 сентября 2013

Попробуйте следующий код после изменения в соответствии с вашими локальными настройками:

var context = new YouDbContext("ConnectionName");
var adapter = (IObjectContextAdapter)context;
var objectContext = adapter.ObjectContext;
EntitySetBase schema = null;
if (objectContext.MetadataWorkspace != null)
{
    schema = objectContext.MetadataWorkspace
        .GetItems<EntityContainer>(DataSpace.SSpace).First()
        .BaseEntitySets
        .First(meta => meta.ElementType.Name == "ClassNameUnderYourDbContext");
}
//See the properties of schema in debug mode to understand details
0 голосов
/ 19 апреля 2012

Схемы Entity Framework являются объектами System.ComponentModel.DataAnnotations.TableAttribute.Вот несколько методов, которые вы можете использовать, чтобы получить имя схемы и имя таблицы прав.Ура!

    private string GetTableName(Type type)
    {
        var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault();
        if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Name))
        {
            return tableAttribute.Name;
        }
        else
        {
            return string.Empty;
        }
    }

    private string GetTableSchema(Type type)
    {
        var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault();
        if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Schema))
        {
            return tableAttribute.Schema;
        }
        else
        {
            return string.Empty;
        }
    }
...