C# 实体框架4的示例:将POCO映射到EAV数据库?

C# 实体框架4的示例:将POCO映射到EAV数据库?,c#,entity-framework-4,poco,C#,Entity Framework 4,Poco,我们的客户为产品做广告,但是产品的属性彼此之间有很大的不同。产品的“类别”几乎和产品的数量一样多 最初,我们创建了一个EAV数据库,在该数据库中为每个“类”的产品添加和删除属性。整个过程都很顺利,但其复杂性令人麻木这是数据库#1。 我们最终提出了一组表示所有产品(POCO)的通用字段,将“额外”字段移动到一个XML字段“全面覆盖”这是数据库#2。 现在,我们有一些客户使用旧的,也有一些客户将使用新的。我们真的不想更新旧的,直到我们需要这样做,但由于EAV结构的原因,我们不时会进行一些更改,这些更

我们的客户为产品做广告,但是产品的属性彼此之间有很大的不同。产品的“类别”几乎和产品的数量一样多

最初,我们创建了一个EAV数据库,在该数据库中为每个“类”的产品添加和删除属性。整个过程都很顺利,但其复杂性令人麻木这是数据库#1。

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

现在,我们有一些客户使用旧的,也有一些客户将使用新的。我们真的不想更新旧的,直到我们需要这样做,但由于EAV结构的原因,我们不时会进行一些更改,这些更改需要花费更长的时间

问题:

  • 有没有关于如何编码EF以将POCO持久化到EAV数据库(其中有字段名表和数据表)的示例
  • 我们是否应该放弃数据库,为所有那些老客户编写“普通”表,因为我们不时会有变化
  • 正常当然是指Boyce Codd正常形式。

    我们通过将旧数据库的结构注入软件,然后映射到存储库中的POCO来处理旧数据库。

    EAV表通常是一件混乱的事情,Joe Celko(in)和许多其他行业专家(例如)正确地警告不要过度使用EAV结构

    撇开所有数据库批评家不谈:基于这样一个EAV的.NET中的对象会是什么样子??它可以有任意数量的任何类型的属性,所以基本上,它必须是一个“通用”的对象,可以有任何形状,差不多

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

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

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

    有关ExpandoObject,请参见:

    • 以下是:

    这是个好建议。我不希望将EAV结构泄漏到我们的存储库中,而是希望EF中的一些函数能够将环境数据转换为干净的强类型POCO。我们的POCO有公共字段,其余字段则有一个通用字段。只需要在EF和这些提取方法之间建立一些链接(不使用SQL存储过程)。我将接受您的其他建议作为答案,即避免EAV结构并重新创建数据库。