【问题标题】:Dynamically adding a property to an entity framework object将属性动态添加到实体框架对象
【发布时间】:2015-08-27 07:00:50
【问题描述】:

我有这样的课程:

public class Empresa 
{
    public string Nombre { get; set; }
    public string NIT { get; set; }
    public string NombreRepresentanteLegal { get; set; }
    public string TelefonoRepresentanteLegal { get; set; }
    public string NombreContacto { get; set; }
    public string TelefonoContacto { get; set; }
}

但是在我的应用程序中,我希望用户能够添加自定义属性,例如 twitter 句柄,但是我还没有找到有关如何做到这一点的文档,我听说过 EAV 模型,但这不是高性能的

【问题讨论】:

  • 您打算将新的实体属性存储到数据库中吗?这些值将如何映射到 Empresa 表?
  • 是的,它们应该存储在数据库中,我不知道这些值将如何映射,它可以是外部表,也可以位于具有新附加字段的同一个 Empresa 表中。比如TextField1、TextField2、TextField3等
  • 您可以将附加数据作为 XML 存储到 XML 列中,并让客户端适当地反序列化/序列化元数据。

标签: c# entity-framework class-design


【解决方案1】:

您可以将附加数据作为 XML 存储到 XML 列中,并让客户端适当地反序列化/序列化元数据。当您不知道数据的结构,或者结构可以在运行时更改时,Xml 可能是一个可行的解决方案。

您还可以对 XML 进行索引以帮助粉碎/查询,因此在处理大型 xml 文档时可以保持性能。

您的类可以包含一个 ExtraPropertiesElement,它接受 XML 字符串并将其解析为 XElement,然后您可以利用 XPath 来查询请求的 xml 元素/属性。

这种方法的一个问题是,所有附加属性都以 XML 形式存储在数据库中,并且对数据执行查询并不容易。这样做很简单,但并不像从表中选择列名那么简单。

您可以阅读有关 XML 数据类型及其用途的更多信息here
您还可以阅读如何查询 XML 列存储 here

public class Empresa 
{
    public string Nombre { get; set; }
    public string NIT { get; set; }
    public string NombreRepresentanteLegal { get; set; }
    public string TelefonoRepresentanteLegal { get; set; }
    public string NombreContacto { get; set; }
    public string TelefonoContacto { get; set; }

    [Column(TypeName="xml")]
    public string ExtraProperties { get; set; }

    [NotMapped]
    public XElement ExtraPropertiesElement
    {
        get { return XElement.Parse(ExtraProperties ); }
        set { ExtraProperties = value.ToString(); }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2011-10-05
    • 2017-10-14
    相关资源
    最近更新 更多