尝试实现Repository模式,我发现的所有示例都非常简单(忽略连接)或使用实体框架。
我的数据库表格如下
tblUser {id, fname, lname, email, password, dateAdded}
tblAccount {id, name, isActive, dateAdded}
tblAccountUser {userId, accountId, isActive, dateAdded}
用户可以拥有多个帐户,一个帐户可以拥有多个用户。 tblUserAccount有一个布尔值,告诉我们用户是否对该帐户有效以及何时添加了用户。
我的pocos直接映射到具有关系的附加属性的表。有没有更好的方法来做这一部分?我想不出一个更好的方法让我的存储库返回GetUsersWithAccounts(userId)之类的关系。
tblUser {
guid id,
string fname,
string lname,
string email,
string password,
date dateAdded,
IList<tblAccount> accounts
}
tblAccount {
guid id,
string name,
bool isActive,
date dateAdded,
IList<tblUser> users
}
//should i have a tblAccountUser poco with something like
//{tblUser user, tblAccount account, bool isActive, date dateAdded}
我有以下存储库:
UserRepository {
Add()...
...
tblUser GetById(guid userId) {}
IEnumberable<tblUser> GetAll() {}
//was unsure if Account repo should retrieve a user's accounts or if the user repo should.
//using uow.User.GetAccounts(user.id) seems natural but please feel free to let me know what you think
IEnumberable<tblAccount> GetAccounts(guid userId){}
//this is the one i was really unsure about
//this would return tblUser obj with its tblUser.Accounts filled.
IEnumberable<tblUser> GetAllWithAccounts()
}
AccountRepository{
Add()
...
AddUser(guid userId) //only adds relation to tblAccountUser Makes sense?
}
//Should i have a repository for the Account <-> User relations?
问题到处都是,总结一下:
批评,链接,帮助所有欢迎致谢。
编辑:
补充说明:应该提到。我想要将用户/帐户放在一起的原因是因为它们将位于网格中,我们可以激活/停用和修改用户或帐户的值。
答案 0 :(得分:1)
A 1&amp; 3当UserRepository方法返回tblUser对象时,不需要填充帐户。所有非集合属性都应由UserRepository处理。 在getter of accounts属性中,调用AccountRepository中的方法以进行数据库调用,以便在第一次调用getter时为用户获取所有帐户。
A 2关系表不需要自己的pocos。
A 4创建另一个存储库以单独处理帐户。
答案 1 :(得分:0)
也许部分答案是减压。存储库模式的重要部分是,您有一个包装数据库调用的类,它返回pocos,而不是ADO类,让您进行单元测试。化妆品部分是使用“选择”方法在同一类中插入/更新/删除方法的分组,让您忘记您正在处理数据库。为什么你想忘记是另一个问题。
获得repo类后,提取它的界面。粗略地,1个存储库对应于1个查询对应于1个平坦的结果集。在存储库中没有连接的概念。您的数据库中的联接可能对应于您的应用程序代码中的集合:User的实例将包含List或Dictionary或IEnumerable of Accounts,并且不会停止具有Users集合的Accounts实例。但用户和帐户不是存储库。它们可能是存储库返回的POCO。更常见的是,它们在应用程序的另一层中定义,并封装数据层返回的POCO。这就提出了一个明显的一致性问题,留待你解决:-)存储库模式对你没有帮助。如果您的用户在“用户”屏幕上选择帐户,则您的User对象可能会调用插入到某个存储库中的AccountUser的方法。如果在“帐户”屏幕上选择“用户”,则“帐户”对象可能会调用相同的方法。该方法可能位于UserRepo,或AccountRepo或SomeOtherRepoAlto。
尝试使用Dapper模拟实体框架是错误的。不要以为你可以编写你的存储库,然后永远不要触摸它们。 Dapper适合热爱数据库的人,并经常与之对话。回购可能会相互重叠。