我有一个名为 GetCustomer
的方法,它返回一个 Customer 对象。
客户对象如下。
Public class Customer
{
public int Id { get; set;}
public string Name { get; set;}
public int CompanyId { get; set;}
}
假设客户与一家公司有关,我必须在屏幕 UI 上显示此客户信息。现在,当我调用 GetCustomer
方法时,我只取回有关客户的详细信息。在屏幕上,我还需要显示该客户所属的companyname
。
一个简单的方法是在客户对象中有一个名为 CompanyName
的属性,并从您的数据层方法中填充它。但我不确定这是否是最佳做法。如果客户也属于 department
,现在我需要将 DepartmentId
和 DeptName
作为属性。 ID 是必须的,因为有时我需要发送 Id 以获取完整的部门/公司对象。
我不想在 Customer 对象中包含 Department and Company
的完整对象。
我假设这是一个常见的场景,其中一个特定对象使用 ID 链接到其他对象,当您带回主要对象时,您只需要显示其他链接对象的名称。
处理此问题的最佳方法是什么。我的主要目的是避免(或更多)额外的数据库调用。
我没有使用 Linq 或 Entity Framework
,只是普通的 ADO.NET
。
最佳答案
这种情况取决于您的目标;
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);
但正如您所猜测的那样,要加载的数据取决于您的需要。想想简单。如果您只需要部门和公司名称,那么您可以在您的数据库上创建一个 View 并可以在您的代码中调用它。您可以创建一个实体作为 CustomerWithFullData
,您可以在该实体中放置一个客户和一个部门等,当您需要显示完整数据时,您可以使用 DB View 填充它。或者不用费心创建实体。如果不需要entity,直接调用DB View DataSet,绑定(bind)Tables。因此,您可以将数据收集工作转移到 DB,这就是我们想要做的。
正如我之前所说,想简单。
关于c# - 在 C# 对象中显示外键对象名称的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8361065/