Можно ли добавлять / изменять объекты EntityFramework во время выполнения?

Вот проблема: мой администратор базы данных хочет иметь возможность добавлять / удалять объекты базы данных, не требуя переустановки приложения, но я хочу иметь возможность использовать расширенные данные, предоставляемые структурой сущностей для типов данных, возвращаемых из хранимых процедур.

Есть ли какой-либо способ перестроить, добавить или удалить сущности из Entity Framework во время выполнения? Например, если dbcontext содержится в изолированном домене приложения, можно ли перезагрузить домен приложения (например, после запуска EdmGen.exe во время выполнения) для добавления новых типов сущностей? Если нет, есть ли способ заменить текст данных другим во время выполнения?


person devinbost    schedule 20.05.2014    source источник
comment
Чем это отличается от добавления новых типов во время выполнения без EF?   -  person soandos    schedule 21.05.2014
comment
@soandos, у вас есть лучшее представление о том, как я могу автоматически генерировать типы из объектов базы данных таким образом, чтобы я мог видеть сигнатуры типов входных параметров и наборы результатов из хранимых процедур SQL Server (во время выполнения)?   -  person devinbost    schedule 21.05.2014
comment
Возможно, я что-то упускаю. Вы ищете способ хранить сигнатуры типов хранимых процедур SQL где-нибудь в вашем приложении без перекомпиляции? Или вы пытаетесь создать новый тип для хранимой процедуры?   -  person soandos    schedule 21.05.2014
comment
Оба. Мне нужно иметь возможность отражать (например, через IL) хранимую процедуру, чтобы определять типы, возвращаемые в результате ее вызова. (Entity Framework генерирует тип результата для представления набора результатов как сложного типа.) Мне также нужно иметь возможность определять имена и типы входных параметров хранимой процедуры, если дано только имя хранимой процедуры. Возможно, я смогу решить проблему, если смогу сделать это через ILGenerator или деревья выражений вообще без EF.   -  person devinbost    schedule 21.05.2014
comment
Что касается первой части, если все эти типы на самом деле представляют собой просто набор значений, почему бы просто не использовать Tuple с записью тега (чтобы предотвратить два типа, которые в остальном идентичны, но имеют разные логические типы) для хранения тип? Что касается последней части, я думаю, что это просто какая-то карта между именами и подписями. Короче говоря, я думаю, что проблема вовсе не в EF. Ваша проблема более простая. Если вы можете сделать это с помощью ILGenerator, деревьев выражений или кортежей, тогда это правильный путь.   -  person soandos    schedule 21.05.2014
comment
А как насчет остальной части приложения? Если модель классов все время меняется, как вы можете построить на ее основе приложение? В любом случае, я не думаю, что EF - ваш лучший выбор здесь. Это действительно не подходит для динамических моделей данных. Здесь лучше работают даже старые наборы данных или ADO.Net.   -  person Gert Arnold    schedule 21.05.2014
comment
Тогда как именно получить имена и типы значений, возвращаемых хранимой процедурой, если ей присвоено ее имя (в виде строки)?   -  person devinbost    schedule 21.05.2014
comment
@GertArnold, это действительно очень просто. Я использую IL для вызова хранимой процедуры и на основе типов, возвращаемых из нее, я могу определить правильные решения, которые нужно принять. Хранимые процедуры используются для очень конкретных целей, поэтому не похоже, что все приложение является изменяемым.   -  person devinbost    schedule 21.05.2014
comment
Единственные известные мне способы использовать либо sys.dm_exec_describe_first_result_set_for_object, который доступен только в SQL Server 2012 и более поздних версиях, либо уродливый взлом, связанный с обратной связью. (См. stackoverflow.com/questions/14574773/.) sys.dm_exec_describe_first_result_set_for_object также не предоставляет информацию о типах возврата для процедур, связанных с динамическим SQL.   -  person devinbost    schedule 21.05.2014
comment
Может быть, микро-ORM, такой как Dapper, подходит здесь. Он будет считывать результат любой хранимой процедуры в динамических данных, поэтому в коде C # вы можете анализировать свойства и значения динамических типов.   -  person Gert Arnold    schedule 21.05.2014