Построение модели OData EF с динамической структурой данных
Можно ли создать модель EF на основе динамической структуры? Например, у меня есть Клиент, который может иметь настраиваемые поля, определенные администратором системы. Исходя из этого, изменяется таблица пользовательских полей, связанных с клиентом, и добавляется новый столбец для нового определенного поля.
Есть ли возможность реализовать это в модели EF, или я должен просто работать без нее и создать собственную реализацию для поддержки данных?
Спасибо!
РЕДАКТИРОВАТЬ1: Итак, после проверки модели EAV я пришел к выводу, что она не совсем соответствует моим потребностям, если я правильно понял, поскольку мои поля не являются динамическими для каждой сущности, но одинаковыми для всех сущностей. В общем, моя структура таблицы выглядит следующим образом:
Customer {Id: int, Name: string}
Customer_CustomFields {Id: int, CustomerId: int, UserDefinedName1, UserDefinedName2,...}
Единственное, что здесь меняется - это UserDefinedName-Column. Имя столбца устанавливается равным имени, определенному пользователем для настраиваемого поля, например "CF_RandomInfo". Тип этого столбца изменяется в зависимости от того, какой тип пользователь выбрал для этого настраиваемого поля (nvarchar(max), float и т. Д.). Также число пользовательских столбцов неизвестно.
Мне было интересно, могу ли я реализовать эту структуру как Contained OpenType в классе клиентов?
1 ответ
Вы можете использовать ссылку на модель EAV.
Но! если вы можете сделать предположение типа "не более XX строковых свойств", вы можете зарезервировать эти свойства в модели, такой как StringProperty1, StringProperty2... (Microsoft часто использует этот метод для пользовательских свойств), и включить / переименовать их на уровне EDM вашего служба данных.
редактировать:
OData v4 поддерживает ссылку opentypes.
Но вы все равно должны хранить свои динамические свойства в базе данных. EAV является наиболее удобным способом в базах SQL - вам просто нужно хранить разрешенные свойства и типы для каждой таблицы / типа сущности.
Если вы хотите использовать функцию OpenType в odata, вы должны предоставить словарь свойств самостоятельно (см. Пример по ссылке). Таким образом, вам нужно объединить вашу "базовую" сущность с расширенными свойствами и ВЫБРАТЬ их в словарь.
Предопределенные свойства пути:
-колоночный способ не меняется, вы просто меняете имя в EDM или на уровне EF через fluentAPI
-String + Decimal + приведение оддатов + валидация охватывает практически все типы, которые вам нужны