vb.net - 每个层次结构组的 Entity Framework 4.2 表(按鉴别器)

标签 vb.net group-by ef-code-first table-per-hierarchy discriminator

我正在开发一个使用 EF 4.2 代码优先模型的项目。该模型包含产品的 TPH 继承结构。我需要在鉴别器上对该继承模型的多态结果进行分组,并且遇到了一些问题。

Entity Framework 不会公开鉴别器来完成此分组。我的第一个问题是我可以直接访问这个鉴别器吗?我的阅读和经验告诉我不行,所以我想出了这个可行的解决方案。它的性能不佳,我对它的维护方式不满意。

我的类(class)看起来像这样(简化):

Public MustInherit Class Product
      <key()>  
      Public Property ProductID as integer

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Product name is required")>
      Public Property Name as String

      <TimeStamp()>
      Public Property Time_Stamp as DateTime = DateTime.Now()
End Class

Public Class Desktop
      Inherits Product

      <StringLength(50, ErrorMessage:="Max 50 characters")>
      <Required(ErrorMessage:="Processor is required")>
      Public Property Processor as String
End Class

Public Class Monitor
      Inherits Product

      <Required(ErrorMessage:="Monitor size is required")>
      Public Property Size_Inches as Integer
End Class

我构建了一个扩展方法,该方法接受产品并将其基本类型名称作为字符串返回。

<Extension()>
Public Function ProductType(ByVal inProduct as Product) as String
      ProductType = inProduct.GetType().BaseType.Name
End Function

这样,我构建了这个结构来按类型对产品结果进行分组,以便我可以运行它们:

Dim tmpProducts = db.Products.ToList()
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _
                             .Select(Function(s) New With {.ProductType = S.Key,
                                                           .Products = S })

我现在可以循环遍历列表以获得我想要的行为,但性能并不理想,我担心随着产品数量的增长,这将是 Not Acceptable 。

For Each ProductGroup in GrpProducts
       Dim TypeName as String = ProductGroup.ProductType
       Dim TypeProducts = ProductGroup.Products
Next

此外,这可以让我轻松访问共享属性(名称),但现在我没有太多选项可以将它们转换为真实类型,也许是围绕 TypeName 的选择案例。 。 .

感谢任何建议,也请原谅上面的任何代码错误,我凭内存重新输入了示例,因为我目前无法访问该项目。

最佳答案

解决方案是进行更多建模,并创建一个新实体 ProductType拥有特性Name 。那么 Product 之间就会有一个简单的 1-N 关系。和ProductType 。我没用过EntityFramework ,但带有NHibernate您可以轻松地使框架始终在查询时加入该表,这样它就不会返回 ProductType 的代理。对于每个 Product ,这可能会损害性能。

作为附加组件,将来 ProductType可以开发其他有趣的属性(例如 Product 中每个 ProductType 的通用值),因此它为您的解决方案增加了灵 active ,尽管它确实会产生向数据库添加另一个表的直接成本。

关于vb.net - 每个层次结构组的 Entity Framework 4.2 表(按鉴别器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423551/

相关文章:

c++ - 从 VB.NET 到 C++ 的变量和循环转换?

vb.net - 字符串中区分大小写/不区分大小写的搜索文本

c# - 如何将其写入 linq to object 查询?

.net - .Net 中奇怪的随机数错误

MySQL - 优化查询并根据列总和查找排名

Mysql前3个计数值

Pandas Dataframe 聚合不同的列组

c# - Entity Framework 6 不在 SQLite 数据库中创建表

entity-framework - 从命令包管理器控制台重新创建 EF CodeFirst 表

sql - 代码优先 Entity Framework 在初始化时不拾取 web.config 连接字符串