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

Zac*_*ott 8 c# poco entity-framework-4

我们的客户宣传产品,但产品的属性彼此差异很大.产品"类"几乎和产品一样多.

最初,我们创建了一个EAV数据库,我们为每个"类"产品添加和删除了属性.整个过程非常有效,但复杂性令人头脑麻木. 这是数据库#1.

我们最终提出了一组共同​​代表所有产品(POCO)的字段,将"额外"字段移动到XML字段"catch all". 这是数据库#2.

现在我们有一些客户使用旧的和一些将使用新的客户.我们真的不想更新旧版本,直到我们需要这样做,但由于EAV结构的原因,我们不时需要更换时间.

问题:

  1. 有关如何编写EF以将POCO持久保存到EAV数据库的任何示例(其中您有一个字段名称表和一个数据表)?
  2. 我们是否应该废弃数据库并为所有老客户编写"正常"表格,因为我们不时会有变化?

正常当然是指Boyce Codd Normal Form.
我们通过将其结构放入软件,然后映射到存储库中的POCO来处理旧数据库.

mar*_*c_s 10

EAV表通常是一个混乱的业务,Joe Celko(避免销毁的EAV)和许多其他行业专家(例如,你应该避免的五个简单数据库设计错误)正确地警告不要使用EAV结构太多.

除了所有数据库批评者:基于这样的EAV的.NET中的对象怎么样才会看起来像?它可以有任意类型的任何数量的属性,所以基本上,它必须是一个"通用"对象,可以采取任何形状,几乎.

这种想法使我的皮肤爬行并违背了强类型语言的最基本概念 - 是的,你可以在像Ruby和Python这样的动态语言中做这样的事情,但是在C#中?

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

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

对于ExpandoObject,请参阅: