我目前正在編寫一個N層架構的ASP.NET系統,其中有一個相對規範化的SQL數據庫後端,但我正在努力讓我的頭腦在查看值應該如何表示在我的業務對象中(我沒有得到使用EF或ORM的特權)。我的表(作爲一個例子),可以構造這樣的:如何在ASP.NET業務對象中表示查找值?
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個數據庫查詢。 - 將
Person
對象的FavouriteColour
屬性設置爲字符串,並在將人物對象寫入數據庫(即獲取顏色名稱並獲取相應的ID)時進行反向查找。這是危險的IMO在不太可能的情況下,兩種顏色在數據庫中具有相同的名稱。 - 將ID和值都存儲在
Person
對象中,並在更新其中一個值時對其進行同步。這似乎過於複雜的一個相對簡單的任務。 - 創建兩個表示,
Person
對象和一個PersonSummary
對象,該對象將所有查找值轉換爲它們的描述性名稱,從而取回對象的只讀版本。
我100%確信,我是(一)本得太多,和(b)使得它複雜得多,它需要的。那麼,是否有這樣做的首選方式?或者有沒有我忽略的選項?任何幫助表示讚賞,我一直在解決這個問題幾個小時,但沒有做出決定。
謝謝。
嗯,我知道選項4將是最有效的,因爲數據庫只被查詢一次,但我更好奇最好的做法是與查找表。網絡上有大量的資源用於N層,但沒有一個可以解釋查找值。 – 2011-03-25 21:05:22
@Karl:在我所有的工作中,我都緩存了查找表內容(至少是使用的部分)。它還沒有引起問題。 - 你的選擇4聽起來很奇怪。你是說你有兩個不同的同一個對象的表示?我會避開它,除非它們在完全獨立的環境中使用(views/api calls/etc)。 – 2011-03-25 22:03:17
哦,不要誤解我的意思,我不想使用選項4,但我只是說在技術上它是最高效的,因爲除了SQL查詢中的連接之外,不需要查找。謝謝你的幫助! – 2011-03-26 01:44:38