0

好的,举个基本的例子,假设我有一个包含费用的应用程序,并且我的 SQL 数据库中的每项费用都有一个 ID、员工 ID 和金额。我应该这样做:

public class Expense
{
    public int Id { get; set; }
    public Employee Employee { get; set; }
    public decimal Amount { get; set; }
}

或这个:

public class Expense
{
    public int Id { get; set; }
    public int EmployeeId { get; set; }
    public decimal Amount { get; set; }
}

你看我通常会做第一个,当我从数据库中获取费用时,我会通过调用构造函数来设置 Employee 字段,例如:Employee = new Employee(int id)这将再次访问数据库以完成 Employee 对象中的成员。这很方便,因为现在我可以通过费用访问员工成员/功能。如果我绑定为 ObjectDataSource,我可以显示类似的Eval("Employee.Name")内容并显示更友好的内容,然后只是一个数字,因为它存储在数据库中。

但是,我正在处理的当前项目可能会运行数十万行,如果我要获取每个对象的第一笔费用详细信息,然后是员工详细信息,那么数据库请求的数量将会飙升。(实际上我当前的项目有一个带有 6-7 个外键的表)。

有什么方法可以让我的蛋糕也吃吗?

也许通过仅具有 Id 字段而不是完整对象字段的接口类?但我觉得我从来没有完全理解过接口,所以我不确定这是否会有所作为。

感谢任何读过这篇文章的人,即使你对我没有任何答案。

4

2 回答 2

3

这取决于:如果您使用的是功能丰富的 ORM (NHibernate) 可以干净地处理诸如关系之类的事情,那么第一个代码会更方便;或者,如果这些是您的 View Model 对象,您可以将此任务委托给 DI 引擎(如 Ninject)。

如果您的应用程序的设计需要更多地控制对象的来来去去,或者如果您大量使用费用(不是员工),您应该使用第二种设计(当然,即 NHibernate 有一个复杂的缓存工具箱可以用来实现这一点)。

于 2013-05-08T17:50:15.647 回答
0

在我看来,您的第二个示例不会阻止您在数据集中同时获取费用和员工。另一方面,我猜你可以为一个员工支付很多费用,所以如果你获取与 100 名员工相关的 1000 项费用,那么你有 1000 个员工对象漂浮在各处,其中 900 个是自重。在类中表示它们的方式不一定会改变在数据库中表示它们的方式。

于 2013-05-08T18:28:14.180 回答