Есть ли способ просмотреть сопоставления столбцов Entity Framework Code First во время выполнения? - PullRequest
5 голосов
/ 28 октября 2011

Сначала я пытаюсь написать дополнение к Entity Framework Code, и мне нужен способ получить конфигурацию столбцов модели во время выполнения. Например, это установка кода на OnModelCreating с помощью DbModelBuilder:

builder.Entity<NwdEmployee>()
    .Property(n => n.ReportsToID).HasColumnName("ReportsTo");

Как только это будет сделано, EntityFramework знает, что имя моего свойства отличается от имени столбца в таблице, но как я могу найти, что строка "ReportsTo" сама относится к ReportsToID во время выполнения? В идеале я пытаюсь написать такой метод, как следующий:

public string GetMappedColumnName<TFrom>(DbContext context, 
    Func<TFrom, object> selector);

Что будет использоваться как:

string mappedColumnName = GetMappedColumnName<NwdEmployee>(context, 
    x => x.ReportsToID);

Я просто не знаю, где найти сопоставленные имена столбцов в DbContext. Они вообще доступны?

1 Ответ

4 голосов
/ 28 октября 2011

Теоретически да. Практически я не уверен, потому что с помощью простого теста я не смог получить эту информацию во время выполнения - я вижу ее в отладчике, но не могу получить ее, потому что тип, который мне нужно использовать, является внутренним в инфраструктуре сущностей.

Теория. Вся картографическая информация доступна во время выполнения, но не через отражение. Они хранятся в экземпляре класса MetadataWorkspace, который определенно не предназначен для непосредственного использования, поскольку каждое взаимодействие с этим классом требует некоторого времени в отладчике, прежде чем вы найдете способ получить нужные данные. Эти данные не доступны через API DbContext. Вы должны преобразовать DbContext обратно в ObjectContext и получить доступ к MetadataWorkspace.

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
GlobalItem storageMapping = objContext.MetadataWorkspace.GetItem<GlobalItem>("NameOfYourContextClass", DataSpace.CSSpace);

Теперь storageMapping является экземпляром класса System.Data.Mapping.StorageEntityContainerMapping, который internal. Насколько я понимаю, этот класс должен быть представлением времени выполнения MSL = отображение между хранилищем и концептуальной моделью.

Если вы используете отладчик, вы можете исследовать экземпляр и найти информацию о сопоставлении между свойствами и столбцами (его достаточно глубокое вложение), поэтому вы также можете использовать отражение, чтобы получить их, но это отражение непубличного интерфейса классов, которые вы используете. не является таковым, поэтому любое исправление / исправление / обновление .NET Framework может сломать ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...