2011-12-02 82 views
2

我有一个名为GetCustomer的方法,它返回一个Customer对象。在c#对象中显示外键对象名称的最佳做法

客户对象如下。

Public class Customer 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 

    public int CompanyId { get; set;} 
} 

可以说客户与公司有关,我必须在屏幕UI上显示此客户信息。现在,当我打电话给GetCustomer方法时,我只收回有关客户的详细信息。在屏幕上,我还需要显示该客户所属的companyname

一个简单的方法就是在客户对象中有一个名为CompanyName的属性,并从datalayer方法中填充它。但我不确定这是否是最佳做法。如果客户也属于department,现在我需要有DepartmentIdDeptName作为属性。因为有时候我需要发送Id来获取完整的Dept/Company对象,所以必须使用Id。

我不想在Customer对象中拥有Department and Company的完整对象。

我假设这是一个常见的场景,其中一个特定的对象通过一个ID链接到其他对象,并且当您带回主对象时,您只需要显示其他链接对象的名称。

什么是最好的方式来处理这个问题。我的主要目的是避免(或更多)额外的数据库调用。

我没有使用Linq or Entity Framework,只是经常ADO.NET

+0

就像一个笔记一样,根据需要根据需要查找公司的主要问题是,如果有一个名为GetCustomers的方法,我将不得不多次调用GetCompany。 –

回答

0

这种情况取决于你的目标;

1 - 如果你想避免额外的数据库调用,你必须通过你的数据库通信器编写你的用户界面只有一个实例,每次打开一次并刷新其成员(适配器,命令..等等)在数据传输结束时进行数据库调用并关闭连接。

2 - 为了您的问题的其他目的,请使用延迟加载。只把ID放在你的实体上,并根据需要初始化和使用ID的所属实体!

例如:

public class Customer 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 

    public int CompanyId { get; set;} 
} 

public class Company 
{ 
    public int CompanyId; 
    //company fields 
} 

// .. on your business layer if you need to use Company data: 
// examine your Customer instance as "customer" 

Company userCompany = GetCompanyWithId(customer.CompanyId); 

但是当你没有你的猜测,数据会加载是疑问取决于你的需求。认为简单。如果您只需要部门和公司名称,则可以在数据库上创建视图并在代码上调用它。您可以创建一个实体为CustomerWithFullData,您可以在此实体中放置一个客户和一个部门等,并且当您需要显示完整数据时,您可以使用数据库视图来填充该数据。或者不打扰创建实体。如果您不需要实体,请直接调用数据库视图并绑定表。所以你可以将数据收集工作转移到数据库,这就是我们想要做的。

正如我以前说过的,认为简单。

0

我会做的是在业务对象级别保留一个OO结构,并修改您的DAL以通过单个数据库往返返回所需的所有信息。

例如,您可以有一个存储过程返回两个结果集:一个用于客户,另一个用于他们引用的公司。您可以使用表值参数将一个或多个客户的列表传递给查找。

根据数据库大小和性能要求,还可以在应用程序启动时将整个Customer和Company表读入内存,缓存结果并根据该数据管理插入/更新/删除。