gpt4 book ai didi

c# - 如何为通用数据库方法创建业务模型包装器?

转载 作者:行者123 更新时间:2023-11-30 14:40:28 25 4
gpt4 key购买 nike

我目前在从我的数据库创建 POCO 对象时遇到性能问题。我使用 Entity Framework 4 作为 OR-Mapper。整个应用程序目前是一个原型(prototype)。

假设我想要一些业务对象,例如类“打印机”或“扫描仪”。这两个类都继承自名为 Product 的 BaseClass。存在业务类。

我尝试使用更通用的数据库方法。我不想为“打印机”或“扫描仪”创建表格。我想要 3 个表:一个称为 Product,另一个称为 Property 和 PropertyValue(它存储所有分配给特定产品的值)。

在我的业务层中,我确实创建了一个特定的对象,如下所示:

public Printer GetPrinter(int IDProduct)
{
Printer item = new Printer();
// get the product object with EF
// get all PropertyValues
// (with Reflection) foreach property in item.GetType().GetProperties
// {
// property.SetValue("specific value")
// }
return item;
}

这是 EF 模型的样子: enter image description here

到目前为止工作正常。目前,我正在进行检索多个集合的性能测试。

我已经创建了一个原型(prototype)并对其进行了多次改进以提高性能。离实用还很远。我用了 919 毫秒创建了 300 个只包含 3 个属性的对象。

选择这样的数据库设计的原因是为了有一个通用的数据库设计。添加新属性只能在业务模型中完成。

我是不是太笨了,无法创建一种检索 xx 对象的高效方法,还是我的方法完全错误?就我对OR-Mapper的理解,他们基本上是在做同样的事情?

最佳答案

我认为您错过了 ORM 的全部要点。人们使用 ORM 的原因是能够持久化业务对象并轻松检索业务对象。您正在使用 ORM 来获取业务对象工厂的数据。工厂使用反射从 ORM 检索的物化类构建业务对象。这总是很慢,因为:

  • 查询编译慢(可以预编译)
  • 对象实体化很慢(你无法避免)
  • 反射很慢(你无法避免)

IMO 如果您想遵循此数据库设计以拥有完全独立于您的业务对象的通用表,则您不需要 ORM,或者至少不需要 EF。

出现性能问题的原因是您的业务模型中没有遵循通用方法。因此,您必须在某个地方将通用数据转换为特定数据 = 运行缓慢。

如果您想提高性能,请定义一组共享属性并将它们放入产品中。然后将您当前的 PropertyValue 和 Property 用于其他非共享属性,或者仅使用存储键值对的 ExtendedProperties 表。您的实体将是具有内部类型属性、共享属性和扩展属性集合的产品类型。这是通用方法。

关于c# - 如何为通用数据库方法创建业务模型包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5260804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com