Как сохранить тип, созданный во время выполнения, используя сущность - PullRequest
0 голосов
/ 11 марта 2011

У меня есть веб-приложение, в котором я хочу, чтобы мои пользователи динамически создавали тип ... Я могу сделать это с помощью отражения, но я не уверен, как сохранить этот тип с помощью Entity Framework

Ответы [ 2 ]

2 голосов
/ 12 марта 2011

Еще раз - применим ли этот подход или нет (и в любом случае это обходной путь), зависит от вашего сценария. Однако вы можете сериализовать ваш объект и сохранить его в поле базы данных. Вы можете в основном сериализовать в любой формат (двоичный, JSON, XML, ...).

Примечание: при использовании типа данных xml вы можете фактически запрашивать данные внутри объекта (не уверен, что вы можете сделать это напрямую с EF, но вы всегда можете написать SP и вызвать его с EF). См. эту ссылку для примера.

Здесь - обзор хранения сериализованных объектов в SQL Server.

Здесь - реализация сериализатора XML. Вы можете использовать его для сериализации вашего объекта в строку перед тем, как присваивать его свойству лица.

1 голос
/ 11 марта 2011

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

Centralхранилище метаданных для EF - класс MetadataWorkspace , но в текущей версии EF этот класс не должен изменяться во время выполнения.Он не предлагает никаких методов для этого.Единственный способ определить MetadataWorkspace во время выполнения - это модифицированный SSDL (описание базы данных), MSL (описание отображения) и CSDL (объектописание классов) файлы.Таким образом, любой «динамический» подход к EF означает:

  • создание типов во время выполнения (refle.emit)
  • создание производных ObjectContext, содержащих новые ObjectSet во время выполнения (refle.emit)
  • изменить базу данных, чтобы она содержала новые таблицы
  • создать все эти файлы сопоставления во время выполнения
  • загрузить файлы сопоставления во время выполнения, создать новое EntityConnection с созданным MetadataWorkspace и передатьэто к экземпляру динамически создаваемого ObjectContext производного типа
  • написать код, который способен работать с динамически создаваемыми объектами
  • написать некоторый код, который способен сохранять информацию о новых типах сущностей и новыхконтекст объекта, потому что в противном случае у вас не будет этих типов после перезапуска приложения

Редактировать:

Вы также можете использовать обходной путь, упомянутый @Yakimych.Сериализуйте экземпляр вашего динамического типа и сохраните его как varbinary (двоичная сериализация) или varchar (сериализация xml).Вам понадобится только простая таблица с Id (PK) и столбцом для сериализованных данных.Вы будете запрашивать таблицу по идентификатору и самостоятельно обрабатывать десериализацию.Вы не сможете запросить таблицу по типу конкретных свойств.

...