У меня есть приложение с несколькими арендаторами, которое включает в себя уровень сервиса OData Web API. У меня есть новое требование для поддержки настраиваемых полей, которые будут уникальны для каждого арендатора, и добавление общих таблиц "customfield01", "customfield02" в мои таблицы недостаточно гибко.
Я рассмотрел несколько способов описания и сохранения пользовательских данных в фоновом режиме, но более сложная часть, по-видимому, расширяет мои службы odata, добавляя настраиваемые поля, по-разному, для каждого арендатора.
Следующая ссылка описывает "Открытые типы" в odata v4 с Web API:
Код примера отлично работает и предоставляет поведение динамических свойств, которое мне нужно для моих объектов. Тем не менее, код только доходит до использования жестко запрограммированного списка значений для задней части. Совершенно не ясно, как заполнить объекты из контекста данных Entity Framework.
Поначалу казалось, что это может быть так же просто, как иметь конкретный вид арендатора в базе данных для каждого арендатора, но проблема в том, что расширенные свойства действительно должны быть "отключаться" от столбцов, пары значений. Из-за этого мне интересно, нужен ли мне отдельный объект для свойств "расширения". Итак, у меня могло бы быть что-то подобное для моих POCOs:
public class Item
{
[Key]
public Guid ItemId { get; set; }
public Guid TenantId { get; set; }
// navigation property for the extension entity
public virtual ItemExtension ItemExtension { get; set; }
}
public class ItemExtension
{
[Key]
public Guid ItemId { get; set; }
// dynamic properties for the open type
public IDictionary<string, object> DynamicProperties { get; set; }}
}
Но опять же возникает вопрос, как заполнить эти объекты данными из моего контекста данных. Еще раз, я подумал, что у меня может быть точка, чтобы раскрыть столбцы, но это не работает, потому что у меня могут быть разные типы данных (что важно для меня) для каждого динамического свойства.
Итак, у меня действительно есть несколько вопросов:
- Означает ли модель POCO выше смысл того, что я пытаюсь выполнить?
- Что должен иметь код ItemController для включения ItemExtension для всех HTTP-глаголов (GET, POST, PUT, PATCH, DELETE)
- Что должен иметь контекст данных для элемента ItemExtension, чтобы он мог получить доступ к расширенным столбцам на внутреннем сервере.
- Как следует сохранить расширенные столбцы на внутренней стороне, чтобы поддержать это.
Насколько я пробовал - много вещей, которые не работают, но я остановился на следующем (предполагая, что нет лучшего способа):
-
Базовый POCO для каждого "расширяемого" объекта с отдельным "расширением", сущность для каждого (например, модель выше)
-
На заднем конце, так как мне нужна неограниченная гибкость и сильные типы данных, я планирую иметь отдельную таблицу расширений для каждой комбинации Tenant/Entity (будет называться как [TenantId]. [ItemExtension] с каждым столбцом названный и введенный по мере необходимости).
То, что мне не хватает, - это все между моими данными и моей моделью. Любая помощь будет принята с благодарностью.