我目前正在编写一个N-Tier架构的ASP.NET系统,它具有相对规范化的SQL数据库后端,但我很难理解如何在业务对象中表示查找值(我不知道)获得使用EF或ORM的特权)。我的表(作为示例)可以这样构造:
CoreDataTable:
ID | Name | Favourite_Colour
---|-------|-----------------
01 | Peter | 01
02 | John | 03
03 | Mary | 05
ColoursLookup:
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。Person
对象中,并在更新其中一个或另一个值时同步它们。对于相对简单的任务来说,这似乎过于复杂。Person
对象和一个PersonSummary
对象,它回取对象的只读版本,并将所有查找值转换为其描述性名称。我100%确信我(a)过度思考这个问题,并且(b)让它变得比它需要的更复杂。那么,有没有一种首选方式呢?还是有一个我忽略的选择?感谢任何帮助,我现在已经解决了几个小时而没有作出决定。
感谢。
答案 0 :(得分:0)
如何在填充person表的查询中加入颜色表。在person对象上有一个FavouriteColor属性。该对象不是表列的真实表示,但所有需要的信息都将在db调用中检索。
答案 1 :(得分:0)
唯一正确的方法是选择一个,测量影响(必要时通过原型),然后将其与下一个选项的影响进行比较。
在不知道你的系统的情况下,我会说选项1可能是最好的 - 如果你要缓存一系列Color对象,那么你不需要每次都去数据库。