Чи є спосіб перегляду відображень стовпців Entity Framework Code First на початку виконання?

Я намагаюся написати надбудову до Entity Framework Code, і мені потрібен спосіб отримати конфігурацію стовпців моделі під час виконання. Наприклад, це налаштування коду на OnModelCreating за допомогою DbModelBuilder :

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

Після цього EntityFramework знає, що ім'я моєї властивості відрізняється від імені стовпця в таблиці, але як я можу знайти, що рядок "ReportsTo" стосується себе ReportsToID під час виконання? В ідеалі я намагаюся написати такий метод:

public string GetMappedColumnName(DbContext context, 
    Func selector);

Які будуть використовуватися як:

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

Я просто не знаю, де знайти зіставлені назви стовпців у DbContext. Чи є вони навіть доступними?

5
Тут є рішення (дещо): stackoverflow.com/a/20807366/861716 .
додано Автор Gert Arnold, джерело
Мені було б дуже цікаво побачити ваше реальне рішення. Не могли б ви опублікувати його як іншу відповідь? Це було б дуже корисно для мене.
додано Автор STW, джерело
Я мав подібну проблему. ось моє рішення: stackoverflow.com/questions/7008212/…
додано Автор maxlego, джерело

1 Відповіді

Теоретично так. Практично я не впевнений, тому що з простим тестом я не зміг отримати цю інформацію під час виконання - я бачу їх в відладчику, але я не можу отримати їх, тому що тип, який потрібно використовувати, є внутрішньою структурою.

Теорія. Вся інформація про відображення доступна під час виконання, але не через відображення. Вони зберігаються в екземплярі класу MetadataWorkspace , який, безумовно, не призначений для безпосереднього використання, оскільки кожна взаємодія з цим класом вимагає певного часу на відладчик, перш ніж ви знайдете потрібні дані. Ці дані недоступні через API DbContext. Потрібно перетворити DbContext назад на ObjectContext і отримати доступ до MetadataWorkspace .

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

Тепер storageMapping - примірник класу System.Data.Mapping.StorageEntityContainerMapping , який є внутрішнім . Як я розумію, цей клас повинен бути уявним для MSL = відображення між сховищем і концептуальною моделлю.

Якщо ви використовуєте відладчик, ви можете вивчити примірник, і ви знайдете інформацію про відображення між властивостями і стовпцями (досить глибокий вкладений), так що ви також можете використовувати відображення, щоб отримати їх, але це відображення на недержавному інтерфейсі класів, які ви не володієте так що будь-який патч/виправлення/оновлення .NET framework може порушити вашу програму.

4
додано
@Sebastian: Це питання для команди ADO.NET. Я не можу відповісти, чому це настільки складно, але це так, як MS API зазвичай працюють - вони внутрішньо складні і закриті для будь-якого розширення, яке спочатку не передбачалося MS.
додано Автор Ladislav Mrnka, джерело
Після того, як у мене була точка входу GlobalItem , інше було просто! Дякую.
додано Автор GenericTypeTea, джерело
Чому так складно отримати цю інформацію? EF дійсно поганий, коли справа доходить до продуктивності об'ємних вставок. Ви можете використовувати користувальницькі EntityDataReader і SqlBulkCopy, щоб виконати завдання, але тільки якщо у вас є ці відображення. Я не хочу жорстко кодувати ці відображення знову і знову, просто щоб зробити ручне виправлення, коли одна з цих відображень змінюється. Я знаю, що OR/M не стосується масових даних. Але розглянемо імпорт з інших систем, де потрібно робити об'ємні вставки. Що тепер?
додано Автор Sebastian Weber, джерело
Можливо, ви даєте шлях до імен стовпців? все, що я бачу, є імена властивостей об'єкта, а не імена стовпців
додано Автор Cedric Dumont, джерело
насправді цей пост допоміг мені отримати ім'я зіставленого стовпця в ef: framework "title =" Отримання назв стовпців властивостей у рамках сутності "> stackoverflow.com/questions/20161854/…
додано Автор Cedric Dumont, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug