【问题标题】:How to dynamically add entity properties using N-Tier Entity Framework?如何使用 N 层实体框架动态添加实体属性?
【发布时间】:2026-01-31 04:35:02
【问题描述】:

我想知道如何向实体动态添加数量不定的未映射属性。我们目前正在使用 DataTable 并动态添加列,然后将该表绑定到 UltraGrid;我想用一个实体来复制它。请注意,我使用的是 N 层实体框架 (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

我想实体的功能至少和数据集一样多……

我将不胜感激任何帮助,即使答案是无法完成。

谢谢。

【问题讨论】:

  • 你可以用ExpandoObject做任何你想做的事情

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


【解决方案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;

【讨论】:

  • 感谢您的回复,但我仍然不确定您建议的解决方案是否适合我的情况。我得到的似乎是一个可序列化的字典属性,而不是已添加到我的实体的单个属性。
  • 使用 DynamicPropertyHelper 的最终结果只产生一个属性,它包含许多值;我在想这个属性是一本字典。将 MyEntity 实体集绑定到 UltraGrid 时,属性名称显示为列,因此有一个名称为 DynamicContent 的列,该列的内容是 XML;但我正在寻找的是代表我添加的多个“动态属性”的多个列。
  • 只是好奇...... DynamicPropertyHelper 似乎模仿了字典的序列化。请您更全面地描述 DynamicPropertyHelper 正在做什么?谢谢。
  • 您的假设是正确的,DynamicContent 属性用于在单个字符串中存储多个名称-值-对,以便在客户端和服务器之间传输——它不应该显示在您的网格中,因为它是私有的。 DynamicPropertyHelper 负责在 xml 中存储和读取这些名称-值-对-集合。您可以通过实体索引器访问各个值,如上所示。
  • 如果您对 DynamicPropertyHelper 的详细信息感兴趣 - 它只是几行代码,而且都是开源的:ntieref.codeplex.com