我目前正在编写一个具有相对规范化的 SQL 数据库后端的 N 层架构的 ASP.NET 系统,但我正在努力了解如何在我的业务对象中表示查找值(我没有特权使用 EF 或 ORM)。我的表(例如)可以这样构造:
核心数据表:
ID | Name | Favourite_Colour
---|-------|-----------------
01 | Peter | 01
02 | John | 03
03 | Mary | 05
颜色查找:
ID | Colour | is_active
---|--------|----------
01 | Red | 1
02 | Green | 1
03 | Blue | 1
04 | Pink | 1
05 | Black | 1
现在最初,我创建的业务对象如下所示:
public class Person
{
protected int PersonID { get; set; }
public string Name { get; set; }
public int FavouriteColour { get; set; }
}
但是,例如,当我想列出数据库中的所有人以及他们最喜欢的颜色时,我应该怎么做?我不能只显示查找 ID,所以现在我看到 4 个选项:
- 向被调用的类添加一个方法,该方法在调用
Person.GetColourStringValue
时从数据库中获取颜色名称。这将是低效的,因为在 100 个“Person”对象上使用此方法将导致 100 个数据库查询。 - 将对象的
FavouriteColour
属性Person
作为字符串,每当将人物对象写入数据库时进行反向查找(即获取颜色名称,并获取相应的ID)。在数据库中两种颜色具有相同名称的不太可能的情况下,这是危险的 IMO。 - 将 ID 和值都存储在
Person
对象中,并在其中一个或另一个值更新时同步它们。对于一个相对琐碎的任务来说,这似乎过于复杂。 - 创建两个表示,
Person
对象和一个PersonSummary
对象,该对象拉回对象的只读版本,所有查找值都转换为它们的描述性名称。
我 100% 确信我 (a) 想太多了,并且 (b) 让它变得比需要的更复杂。那么,有没有首选的方法呢?或者有没有我忽略的选项?任何帮助表示赞赏,我已经解决了几个小时没有做出决定。
谢谢。