我想知道如何向实体动态添加数量不确定的未映射属性。我们目前使用的是DataTable并动态添加列,然后将该表绑定到UltraGrid;我想用一个实体来复制它。请注意,我使用的是N-Tier实体框架(https://ntieref.codeplex.com/)。
我可以动态创建一个具有属性的实体,也可以动态地向不包含任何映射属性的现有实体添加属性。每次应用程序运行时,都会添加不同数量的属性,因此我不需要永久保留新的/动态属性。我希望能够将EntitySet绑定为UltraGrid的数据源;我将不会直接利用此实体进行数据修改,而只是访问状态跟踪。
我在N层实体框架库中找到了一个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
我认为实体至少具有和datasets…一样多的功能
我非常感谢任何人的帮助,即使答案是不可能做到的。
谢谢。
发布于 2014-05-24 06:07:54
您可以通过重写受保护的方法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;https://stackoverflow.com/questions/23810996
复制相似问题