代码之家  ›  专栏  ›  技术社区  ›  AaronSieb

在LINQ中,实现与子集合相关的业务规则的最优雅的方法是什么?

  •  0
  • AaronSieb  · 技术社区  · 15 年前

    我的数据库中有两个表:

    Wiki
        WikiId
        ...
    
    WikiUser
        WikiUserId (PK)
        WikiId
        UserId
        IsOwner
        ...
    

    这些表具有一对多(WikiUser)关系。

    如何在LINQ实体类中实现以下业务规则:

    我已经试过如下更新表:

    Wiki
        WikiId (PK)
        OwnerId (FK to WikiUser)
        ...
    
    WikiUser
        WikiUserId (PK)
        WikiId
        UserId
        ...
    

    这会强制执行约束,但是如果我从Wiki的WikiUser集合中删除所有者的WikiUser记录,就会收到一个丑陋的SqlException。这似乎很难在UI中捕获和处理。

    是否可以在生成SqlException之前执行此检查?一个更好的方法来构建我的数据库?一种捕获并将SqlException转换为更有用内容的方法?

    编辑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.
    }
    

    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
    }
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Jacob Proffitt    15 年前

    这个问题有太多的依赖性,无法很好地回答,其中最大的依赖性是您计划在哪里全面实施业务规则。按照优先顺序,您必须问:您有业务规则层吗?如果没有,是否有独立的数据访问层?如果没有,您是否使用数据提供程序模型?如果不是,那么无论您在处理配置UI的什么地方,您都在考虑强制执行这种事情(或处理SqlException)。

    对于wiki之类的东西,您可能不需要非常复杂的业务规则引擎,因为您的问题域已经受到了很好的约束。而且,这听起来像是一种几乎从不改变的规则,因此将其隔离在正式的规则层中有点过分了。因此,最好不要在数据层或数据提供程序中设置这种约束。

    例如,如果使用Linq to Sql,可以通过将模型中的OwnerId属性设置为与WikiUser表的关系绑定的不可为空的属性来镜像在Sql Server中所做的工作。这将强制填充OwnerId属性(因为它是不可为空的),并为您提供要查找的唯一约束。

    推荐文章