2012-02-24 2 views
4

Наша база данных была разработана таким образом, что существуют различные схемы для производства и различные эквивалентные схемы для тестирования. Например, многие таблицы сохраняются в схеме MyProduction, тогда как одни и те же таблицы хранятся в схеме MyTest.Как получить имя схемы сущности с помощью Code First (Entity Framework) и DbContext?

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

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

Thank you.

+0

Вам не нужно, чтобы получить его - вы ответственны за отображение поэтому необходимо определить, какие схемы и таблицы объект сопоставляется. –

+0

Мне это нужно. У меня есть как минимум 6 отдельных схем, которые я должен использовать. Три схемы предназначены для тестирования и три для производства. Каждый из них содержит 100 столов. Будет намного эффективнее писать: если thisAnonymousTable использует эту производственную схему, то измените ее на MyTestSchema (если необходимо), а не на управление тремя отдельными списками из 100 таблиц, каждая с их возможными конфигурациями. Мои классы и контексты генерируются из EDM генератором CodeFirstTemplate, так что схемы должны быть доступны для получения. Мой вопрос не был, мне нужно это сделать, мой вопрос был так. Спасибо. –

+0

Не то, чтобы это имело значение, но я мог бы сделать это с NHibernate до перехода на Entity Framework. Мне нравится Entity Framework намного лучше, но мне все еще нужно реализовать эту функциональность, поэтому я надеюсь сделать это в событии OnModelCreating. –

ответ

-1

Схемы схемы сущностей - это объекты 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; 
     } 
    } 
+0

Можете ли вы сообщить мне причину голосования? – Tarzan

-1
System.ComponentModel.DataAnnotations.Schema.TableAttribute 
0

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

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

Удалить. Сначала (...) часть запроса, если вы хотите получить всю схему. –

+0

См. Http://stackoverflow.com/questions/18587865/how-to-get-name-of-schema-from-entity-framework/18591456#18591456 –