2012-10-04 46 views
2

我正在使用servicestack,並且計劃使用ormlite作爲數據訪問層。 我有這些表(SQL Server 2005中)使用ServiceStack.ORMLite構建存儲庫

Table ITEM 
ID PK 
... 

Table SUBITEM1 
ID PK FK -> ITEM(ID) 
... 

Table SUBITEM2 
ID PK FK -> ITEM(ID) 
... 

Table POST 
ID PK 
... 

Table COMMENT 
ID PK 
... 

Table DOWNLOAD 
ID PK 
... 

Table POST_COMMENT 
ID PK 
POST_ID FK -> POST(ID) 
COMMENT_ID FK -> COMMENT(ID) 

Table DOWNLOAD_COMMENT 
ID PK 
DOWNLOAD_ID FK -> DOWNLOAD(ID) 
COMMENT_ID FK -> COMMENT(ID) 

我創建了一個類爲每個表和使用註釋(自動增量,參考文獻等)映射到它們。

我決定爲每個「實體」(item,post,comment,download)創建一個存儲庫。 每個存儲庫包含基本的CRUD邏輯,例如

例如。 1 CommentRepository具有執行db.Insert(註釋,關係)的保存(評論評論,對象關係),其中關係是PostComment或DownloadComment。

例如。 2 PostRepository具有執行插入到POST的Save(Post p)。

我不確定這個解決方案,因爲存儲庫接口是不同的,我不能做多態查詢。

你能提供任何建議來改善我的DAL嗎?

感謝您的關注。

回答

11

我不是強制人工抽象的粉絲,所以我不喜歡從每個實體的倉庫開始,因爲它只會導致不必要的代碼膨脹。我喜歡從所有實體開始只有一個存儲庫,用於封裝所有數據訪問,當它變得太大時自然重構。

我不知道夠了你的域名知道最好的RDBMS佈局是什麼樣的,但我也很喜歡,以避免產生非必要的表,如有可能將目光團塊非集合根數據,例如如果子項只能適用,是不是它的父項的範圍之外有意義的,那麼我只想團塊它節省了情侶對錶,例如:

class Item { 
    int Id; //PK, AutoIncr 
    List<SubItem> SubItem; 
} 

,而不是單獨的多比多桌,我只想保持它在單一的評價表,如:

class Comment { 
    int Id; //PK, AutoIncr 
    string CommentType; //i.e. Post or Download 
    int RefId; 
    string Comment; 
} 

所以我的倉庫將模仿履行web請求所需的數據訪問模式,是這樣的:

class BlogRepository { 
    void AddCommentToPost(int postId, Comment comment); 
    void AddCommentToDownload(int downloadId, Comment comment); 
} 
+0

喜mythz,我真的更加感激吃了你的答案。 –

+0

投票是如何欣賞顯示在StackOverflow :) – mythz

+0

嗨mythz,我真的很感激你的答案。我可以根據您的建議修改發佈,下載和評論之間的多對多關係,但我無法修改項目/子項目層次結構。的SubItem1和SubItem2是項目的子類,因爲有填充這些表的觸發器我不能使用BLOB數據。 –