Entity Framework 4.1 Динамическое получение сопоставленного имени столбца - PullRequest
5 голосов
/ 01 июня 2011

Я пытаюсь построить оператор SQL динамически.

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

Мои классы EntityTypeConfiguration указывают значение HasColumnName, чтобы сопоставить имя свойства Entity с именем столбца таблицы БД, которое мне нужно для построения оператора SQL.

namespace MyDomain {
    public class TestEntityConfig : EntityTypeConfiguration<TestEntity>{
        Property("Name").HasColumnName("dbName");
    } 
 }

Из того, что я исследовал, кажется, что я могу получить доступ к этой информации через MetadataWorkspace, к которому я могу получить доступ через ObjectContext.

Мне удалось получить интересующую меня сущность с помощью MetadataWorkspace.GetItem («MyDomain.TestEntity», DataSpace.OSpace), который дает мне доступ к свойствам, но ни одно из свойств Properties не дает мне имя сопоставленного столбца БД, как указано в HasColumnName.

Также мне не ясно, что такое DataSpace.OSpace и почему моя модель построена в этом пространстве.

Если кто-нибудь сможет пролить свет на это, я был бы признателен

UPDATE

В дополнение к комментариям @ Ladislav. Я обнаружил, что могу получить информацию следующим образом Для свойств класса

ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members

Для свойств таблицы

ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members

Итак, учитывая, что я знаю только тип MyDomain.TestEntity и Memeber «Имя». Как бы я пошел, чтобы получить "dbName". Могу ли я всегда предполагать, что мой сопоставленный класс будет создан в CodeFirstDatabaseSchema, для динамического создания идентификатора, чтобы извлечь его из SSpace, и как мне получить правильный член в SSpace. Могу ли я сделать что-то вроде

var memIndex = ctx.MetadataWorkspace.GetItem<ClrEntityType>("MyDomain.TestEntity", DataSpace.OSpace)).Members["Name"].Index;

var dbName = ctx.MetadataWorkspace.GetItem<EntityType>("CodeFirstDatabaseSchema.TestEntity",SSpace).Members[memIndex];

1 Ответ

0 голосов
/ 01 июня 2011

MetadataWorkspace contanis несколько контейнеров, указанных DataSpace.Вам интересно:

  • CSpace - описание концептуальной модели (должно содержать свойства)
  • CSSpace - отображение концептуальной модели на модель хранилища (в ней должно содержаться описание классов / свойств).сопоставлены с таблицами / столбцами)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...