我正在使用servicestack,我打算使用ormlite作为数据访问层。 我有这些表(SQL Server 2005)
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)
我为每个表创建了一个类,并使用注释(自动增量,引用等)映射它们。
我决定为每个“实体”(项目,帖子,评论,下载)创建一个存储库。 每个存储库都包含基本的CRUD逻辑,
例如。 1 CommentRepository有一个Save(注释,对象关系),它执行db.Insert(注释,关系),其中关系是PostComment或DownloadComment。
例如。 2 PostRepository有一个Save(Post p)执行插入POST。
我不确定这个解决方案,因为存储库界面不同,我无法进行多态查询。
您能提供任何建议来改善我的DAL吗?
感谢您的关注。
答案 0 :(得分:11)
我不是强制人工抽象的粉丝所以我不喜欢从每个实体的存储库开始,因为它只会导致不必要的代码膨胀。我喜欢从封装所有数据访问的所有实体开始只有一个存储库,当它变得太大时,自然会重构。
我不太了解您的域名,知道最佳RDBMS布局是什么,但我也希望尽可能避免创建不必要的表格,并且会查看blob非聚合根数据,例如:如果SubItem只能在其父项的上下文之外应用并且没有意义,那么我只想保存几个表,例如:
class Item {
int Id; //PK, AutoIncr
List<SubItem> SubItem;
}
而不是单独的Many:许多表,我只是将它保存在单个Comment表中,例如:
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);
}