我想知道如何动态地向实体添加未确定数量的未映射属性。我们目前正在使用DataTable并动态添加列,然后将该表绑定到UltraGrid;我想用一个实体复制它。请注意,我使用的是N层实体框架(https://ntieref.codeplex.com/)。
我可以动态创建具有属性的实体,也可以动态地将属性添加到不包含任何映射属性的现有实体。每次运行应用程序时,都会添加不同数量的属性,因此我不需要永久保留新的/动态属性。我希望能够将EntitySet绑定为UltraGrid的数据源;我不会直接利用这个实体进行数据修改,只能访问状态跟踪。
我在N-Tier Entity Framework库中找到了一个DynamicPropertyHelper类,但我无法确定它的用途。
我的实体已经从另一个类继承,因此不能从ExpandoObject继承。
以下是一些相关帖子,但我不认为这些是我正在寻找的答案 Dynamically add new property with any name to object
我想认为实体至少具有与数据集一样多的功能......
我很感激任何帮助,即使答案是无法做到的。
谢谢。
答案 0 :(得分: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;