Часто существует несколько способов решения проблемы, и это не исключение. В этом случае вам нужно разрешить пользователям добавлять новые поля в ваше приложение и базу данных и использовать эти поля из вашего приложения. Вот несколько способов сделать это:
a) Разрешить пользователям изменять схему базы данных.
б) Создайте отдельную структуру для определения «пользовательских полей» и хранения в них данных.
c) Создайте пустые «зарезервированные» поля в таблицах, где пользователям, скорее всего, понадобятся свои собственные поля.
Я предпочитаю подход (b), а иногда - (c) всякий раз, когда в приложении требуются пользовательские настраиваемые поля. Вот некоторые плюсы / минусы для каждого из трех:
Изменить схему
• Рискованно : Если вы позволите пользователям изменять схему базы данных, где вы проведете линию? Если они могут добавлять поля, они также могут изменить определение существующих полей, добавить или удалить индексы и т. Д. Это может привести к кошмару поддержки с ошибками, проблемами производительности и т. Д., Вызванными изменениями схемы, выполненными пользователями.
• Performant : хранение новых пользовательских полей, встроенных в существующие таблицы, обычно дает преимущество в производительности по сравнению с отдельной структурой, но только до тех пор, пока они не выходят за рамки изменений.
• Clunky : EF определяет схему во время разработки, поэтому для выполнения этой работы во время выполнения вам потребуется генерировать новые классы сущностей во время выполнения с членами, представляющими новые поля, и вам нужно будет обновить отображение метаданные во время выполнения. Сгенерированные во время выполнения классы сущностей могут наследоваться от сгенерированных классов во время разработки, поэтому вам нужно только добавить членов и сопоставления для новых пользовательских полей. Хотя возможно, это неуклюже. Код, который использует классы, созданные во время выполнения, должен использовать отражение для доступа к новым членам, созданным во время выполнения.
Отдельная структура
• Удобный для пользователя: Создав отдельную структуру для хранения пользовательских полей, вы можете создать логику приложения для пользователей, чтобы добавлять / удалять эти поля и т. Д. Им не нужно связываться с базой данных, вместо этого вы можете иметь формы обслуживания в приложении для добавления новых полей.
• EF-friendly: нет необходимости связываться с классами сущностей и отображать метаданные во время выполнения. Все определяется во время разработки, а пользовательские поля - это просто данные.
• Чуть менее производительный: Наличие отдельных таблиц для определения и хранения пользовательских полей может сделать поиск немного более дорогостоящим из-за дополнительных циклических переходов или дополнительных объединений.
Зарезервированные поля
• Достаточно часто: Во многих ситуациях пользовательские поля используются только для одного или нескольких дополнительных полей. Резервирование пары столбцов часто покрывает 99% потребностей пользователей. Даже общее поле «примечания» в каждой таблице часто достаточно в приложениях больших объектов.
• Limited: Если пользователи хотят больше полей, чем вы зарезервировали, или других типов данных, которые вы зарезервировали, это может быть ограничением.
• Исполнитель: Встроенные столбцы, извлеченные без дополнительных возвратов или объединений.
• Определено во время разработки: Нет времени выполнения возни с определениями или отображениями типов сущностей.