如何使用N层实体框架动态添加实体属性?

时间:2014-05-22 15:22:45

标签: c# entity-framework dynamic n-tier-architecture

我想知道如何动态地向实体添加未确定数量的未映射属性。我们目前正在使用DataTable并动态添加列,然后将该表绑定到UltraGrid;我想用一个实体复制它。请注意,我使用的是N层实体框架(https://ntieref.codeplex.com/)。

我可以动态创建具有属性的实体,也可以动态地将属性添加到不包含任何映射属性的现有实体。每次运行应用程序时,都会添加不同数量的属性,因此我不需要永久保留新的/动态属性。我希望能够将EntitySet绑定为UltraGrid的数据源;我不会直接利用这个实体进行数据修改,只能访问状态跟踪。

我在N-Tier Entity Framework库中找到了一个DynamicPropertyHelper类,但我无法确定它的用途。

我的实体已经从另一个类继承,因此不能从ExpandoObject继承。

以下是一些相关帖子,但我不认为这些是我正在寻找的答案 Dynamically add new property with any name to object

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

我想认为实体至少具有与数据集一样多的功能......

我很感激任何帮助,即使答案是无法做到的。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以通过覆盖受保护的方法GetDynamicValueSetDynamicValue来允许实体支持动态属性。

由您决定如何通过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;