我正在使用代码优先和实体框架创建我的数据库。我正在定义我所有的模型都很好用,但现在我有一个可以包含块的页面类。这些块有一个带有 ID、BlockType、Position、Name 等的基类,但是有不同类型的块具有不同的属性,它们是从这个基类继承的类。我想知道如何设置我的模型,以便页面可以拥有“块”的集合,而无需将自定义属性存储在逗号分隔列表或类似列表中。可能吗?什么是建模这个的“好”方法..
提前致谢!
我正在使用代码优先和实体框架创建我的数据库。我正在定义我所有的模型都很好用,但现在我有一个可以包含块的页面类。这些块有一个带有 ID、BlockType、Position、Name 等的基类,但是有不同类型的块具有不同的属性,它们是从这个基类继承的类。我想知道如何设置我的模型,以便页面可以拥有“块”的集合,而无需将自定义属性存储在逗号分隔列表或类似列表中。可能吗?什么是建模这个的“好”方法..
提前致谢!
实体框架支持继承。有多种策略可以将您的对象模型(基类和派生类)映射到数据库模式。最重要的是:
每个层次结构表 (TPH):基类和所有派生类将映射到数据库中的单个表。派生类的任何自定义属性都将在表中显示为单独的列,并且该表包含用于区分类型的鉴别器列。EF 设法加载实现特定类型所需的列。
每个类型的表(TPT):基类有自己的表,它只包含基类属性。每个派生实体都会获得另一个具有此类型附加属性的表。EF 设法从包含所有属性的不同表中加载属性(创建适当的连接)以实现特定类型。
在我看来,TPT 是实现继承的更简洁的方法,但它目前(EF <= 4.3)与 TPH 相比存在性能问题,因为 EF 生成的 SQL 不是最理想的。该问题将在 EF 5.0 中得到解决。但 TPH 仍将是更高效的映射方式,因为它不需要连接多个表。
链接的博客文章中详细讨论了这些策略的优点和缺点。在博客中,您还可以找到第三个(不太常用的)选项 -每个具体类型的表 (TPC)。