在c#对象中显示外键对象名称的最佳实践

时间:2011-12-02 18:44:39

标签: c# ado.net webforms

我有一个名为GetCustomer的方法,它返回一个Customer对象。

客户对象如下。

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作为属性。 Ids是必须的,因为有时我需要发送Id以获得完整的Dept / Company对象。

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

我认为这是一个常见的场景,其中特定对象使用ID链接到其他对象,当您带回主对象时,您只需要显示其他链接对象的名称。

处理此问题的最佳方法是什么。我的主要目的是避免(或更多)额外的数据库调用。

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

2 个答案:

答案 0 :(得分:0)

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

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

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,并且可以将客户和部门等放在此实体中,当您需要显示完整数据时,可以使用DB View填充该数据。或者不打扰创建实体。如果您不需要实体,请直接调用DB View查看DataSet并绑定表。因此,您可以将数据收集工作传输到DB,这就是我们想要做的。

正如我之前所说,想想简单。

答案 1 :(得分:0)

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

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

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