【问题标题】:Examples for Entity Framework 4: Mapping POCOs to EAV database?实体框架 4 的示例:将 POCO 映射到 EAV 数据库?
【发布时间】:2011-04-19 00:26:25
【问题描述】:

我们的客户为产品做广告,但产品的属性却大相径庭。产品“类别”几乎与产品一样多。

最初,我们创建了一个 EAV 数据库,我们在其中添加和删除了每个“类别”产品的属性。整个事情运作良好,但复杂性令人麻木。 这是数据库 #1。

我们最终提出了一组表示所有产品 (POCO) 的通用字段,将“额外”字段移动到 XML 字段“全包”。 这是数据库 #2。

现在我们有一些客户使用旧的,一些客户将使用新的。在需要更新旧版本之前,我们确实不想更新旧版本,但由于 EAV 结构,我们有时会进行一些更改,这些更改只需要比必要的时间更长。

问题:

  1. 有关如何编写 EF 以将 POCO 持久保存到 EAV 数据库(其中有字段名称表和数据表)的任何示例?
  2. 考虑到我们不时发生变化,我们是否应该废弃数据库并为所有这些老客户编写“正常”表?

Normal 当然是指 Boyce Codd 范式。
我们通过将其结构注入软件来处理旧数据库,然后映射到存储库中的 POCO。

【问题讨论】:

    标签: c# entity-framework-4 poco


    【解决方案1】:

    EAV 表通常是一项混乱的业务,Joe Celko(Avoiding the EAV of Destruction)和许多其他行业专家(例如Five Simple Database Design Errors You Should Avoid)正确地警告不要过度使用 EAV 构造。

    抛开所有的数据库批评者不谈:.NET 中基于这种 EAV 的对象看起来会是什么样子?它可以有任意数量的任意类型的属性,所以基本上,它必须是一个可以呈现任意形状的“通用”对象。

    这个想法让我毛骨悚然,违背了强类型语言的最基本概念——是的,你可以用 Ruby 和 Python 这样的动态语言来做类似的事情,但是用 C# 呢?

    唯一可行的选择可能是 .NET 4.0 中的新“动态”类型和 ExpandoObject - 一个可以呈现任何形状、具有任何类型的任何属性的对象,基本上是你想要的任何东西是。

    您可以想象 SQL Server 中的 EAV 结构和 C# 4.0 中的 ExpandoObject 之间的映射——但我非常怀疑 EF 团队在这方面做了什么,老实说,我认为他们不会很快.但这可能是您探索的一种可能性。

    对于 ExpandoObject,请参阅:

    【讨论】:

    • 这是个好建议。我希望不要将 EAV 结构泄漏到我们的存储库中,而是让 EF 加上 EF 中的一些函数将环境数据转换为干净且强类型的 POCO。我们的 POCO 具有通用字段,其余字段则包含所有字段。只需要在 EF 和这些提取方法之间建立一些联系(不使用 SQL 存储过程)。
    • 我会采纳你的其他建议作为答案,即避免使用 EAV 结构并重新创建数据库。
    猜你喜欢
    • 2011-05-06
    • 2010-10-14
    • 2012-05-23
    • 1970-01-01
    • 2016-03-18
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多