我的数据库中有两个表:
Wiki
WikiId
...
WikiUser
WikiUserId (PK)
WikiId
UserId
IsOwner
...
这些表具有一对多(WikiUser)的关系。
我将如何在我的 LINQ 实体类中实现以下业务规则:
“一个 Wiki 必须只有一个所有者?”
我尝试如下更新表格:
Wiki
WikiId (PK)
OwnerId (FK to WikiUser)
...
WikiUser
WikiUserId (PK)
WikiId
UserId
...
这会强制执行约束,但如果我从 Wiki 的 WikiUser 集合中删除所有者的 WikiUser 记录,我会收到一个丑陋的 SqlException。这似乎很难在 UI 中捕获和处理。
有没有办法在生成 SqlException 之前执行此检查?构建数据库的更好方法?一种捕获 SqlException 并将其转换为更有用的方法的方法?
编辑:如果可能,我希望将验证规则保留在 LINQ 实体类中。
编辑2:关于我的具体情况的更多细节。
在我的应用程序中,用户应该能够从 Wiki 中删除用户。他们应该能够删除任何用户,除了当前被标记为 Wiki 的“所有者”的用户(一个 Wiki 必须始终只有一个所有者)。
在我的控制逻辑中,我想使用这样的东西:
wiki.WikiUsers.Remove(wikiUser);
mRepository.Save();
并将任何违反的规则转移到 UI 层。
我不想做的是:
if(wikiUser.WikiUserId != wiki.OwnerId) {
wiki.WikiUsers.Remove(wikiUser);
mRepository.Save();
}
else {
//Handle errors.
}
我也不是特别想将代码移动到我的存储库(因为没有任何指示不使用本机 Remove 函数),所以我也不想要这样的代码:
mRepository.RemoveWikiUser(wiki, wikiUser)
mRepository.Save();
这是可以接受的:
try {
wiki.WikiUsers.Remove(wikiUser);
mRepository.Save();
}
catch(ValidationException ve) {
//Display ve.Message
}
但这会捕获太多错误:
try {
wiki.WikiUsers.Remove(wikiUser);
mRepository.Save();
}
catch(SqlException se) {
//Display se.Message
}
我也不想明确调用业务规则检查(尽管它可能变得必要):
wiki.WIkiUsers.Remove(wikiUser);
if(wiki.CheckRules()) {
mRepository.Save();
}
else {
//Display broken rules
}