我目前在使用Entity Framework 4作为OR-Mapper从我的数据库中创建POCO对象时遇到了性能问题。整个应用程序现在是一个原型。
假设我想要一些业务对象,比如类“Printer”或“Scanner”。这两个类都继承自一个名为Product的基类。这些业务类已经存在。
我尝试使用更通用的数据库方法。我不想为“Printer”或“Scanner”创建表格。我想要有3个表:一个叫做Product,另外两个是Property和PropertyValue(它们存储分配给特定产品的所有值)。
在我的业务层中,我会像这样创建一个特定的对象:
这是EF模型的样子:
目前为止运行良好,我正在进行检索多个集合的性能测试。
我创建了一个原型并进行了多次改进以提高性能。但它离可用还有很长的路要走。 创建300个仅包含3个属性的对象需要919毫秒。
选择这种数据库设计的原因是为了拥有通用的数据库设计。添加新属性应该只在业务模型中完成。
我是不是太愚蠢了,无法创建一个高效的检索xx对象的方法,或者我的方法完全错误?就我所了解的ORM映射器,它们基本上都是做同样的事情吗?
假设我想要一些业务对象,比如类“Printer”或“Scanner”。这两个类都继承自一个名为Product的基类。这些业务类已经存在。
我尝试使用更通用的数据库方法。我不想为“Printer”或“Scanner”创建表格。我想要有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](https://istack.dev59.com/rwADO.webp)
我创建了一个原型并进行了多次改进以提高性能。但它离可用还有很长的路要走。 创建300个仅包含3个属性的对象需要919毫秒。
选择这种数据库设计的原因是为了拥有通用的数据库设计。添加新属性应该只在业务模型中完成。
我是不是太愚蠢了,无法创建一个高效的检索xx对象的方法,或者我的方法完全错误?就我所了解的ORM映射器,它们基本上都是做同样的事情吗?
Property
和PropertyValue
是元表。它们并不直接映射到实际的业务实体,而是用于通用地定义新的“类型”实体及其相关值。我同意这种方法很强大(有时非常有用),但你肯定会在性能上付出代价。 - rsenna