Как динамически добавлять свойства сущностей, используя N-Tier Entity Framework?

1

Я хотел бы знать, как динамически добавлять неопределенное количество неименованных свойств для объекта. В настоящее время мы используем DataTable и динамически добавляем столбцы, а затем привязываем эту таблицу к UltraGrid; Я хотел бы воспроизвести это с помощью сущности. Обратите внимание, что я использую инфраструктуру Entity N-Tier (https://ntieref.codeplex.com/).

Я мог либо динамически создавать объект со свойствами, либо динамически добавлять свойства к существующему объекту, который не содержит каких-либо отображаемых свойств. Каждый раз, когда приложение запускается, будет добавлено другое количество свойств, поэтому мне не нужно постоянно сохранять новые/динамические свойства. Я хочу иметь возможность привязывать EntitySet как источник данных для UltraGrid; Я не буду использовать этот объект для изменения данных напрямую, только для доступа к отслеживанию состояния.

Я нашел класс DynamicPropertyHelper в библиотеке Entity Framework N-Tier, но не смог определить, для чего он используется.

Мои объекты уже наследуются от другого класса и поэтому не могут наследовать от ExpandoObject.

Вот некоторые связанные должности, но я не думаю, что они являются ответом, которого я ищу.
Динамически добавлять новое свойство с любым именем в объект

http://social.msdn.microsoft.com/Forums/en-US/e9ebabd3-1423-48f5-a57b-cf1248117851/how-do-i-add-a-property-field-at-runtime-in-c? Форум = Vsexpressvcs

Я хотел бы думать, что у сущностей есть как минимум такая функциональность, как наборы данных...

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

Спасибо.

Теги:
entity-framework
dynamic
n-tier

1 ответ

1

Вы можете разрешить сущностям поддерживать динамические свойства, переопределяя защищенные методы GetDynamicValue и SetDynamicValue.

Это зависит от вас, как значения динамических свойств хранятся и отображаются через контракт данных WCF. Однако вы можете использовать DynamicPropertyHelper для выполнения этой задачи. Помощник использует двоичную сериализацию и кодировку base-64 для хранения всех динамических свойств в виде строки XML. Вот пример:

partial class MyEntity
{
    [DataMember]
    [SimpleProperty]
    private string DynamicContent
    {
        get { return _dynamicContent; }
        set
        {
            if (_dynamicContent != value)
            {
                OnPropertyChanging("DynamicContent", value);
                var previousValue = _dynamicContent;
                _dynamicContent = value;
                OnPropertyChanged("DynamicContent", previousValue, value);
            }
        }
    }
    private string _dynamicContent;

    protected override object GetDynamicValue(string propertyName)
    {
        return DynamicPropertyHelper.GetDynamicProperty(DynamicContent, propertyName);
    }

    protected override void SetDynamicValue(string propertyName, object value)
    {
        var dynamicContent = DynamicContent;
        DynamicPropertyHelper.SetDynamicProperty(ref dynamicContent, propertyName, value);
        DynamicContent = dynamicContent;
    }
}

Затем вы можете просто установить и получить динамические значения свойств с помощью индексатора сущностей:

MyEntity x = ...;
x["DynamicPropertyName"] = dynamicPropertyValue;
  • 0
    Я ценю ваш ответ, но я все еще не уверен, что предложенное вами решение подходит для моей ситуации. То, что я получаю, похоже на сериализуемое свойство словаря, а не отдельные свойства, которые были добавлены в мою сущность.
  • 0
    Конечный результат с использованием DynamicPropertyHelper дает только одно свойство, которое содержит много значений; Я думаю, что это единственное свойство - словарь. При связывании набора сущностей MyEntity с UltraGrid имена свойств отображаются в виде столбцов, поэтому существует столбец с именем DynamicContent, а содержимое столбца представляет собой XML; но я ищу несколько столбцов, представляющих несколько «динамических свойств», которые я добавил.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню