Asp.net mvc 在控制器中创建多对多模型的模式

Asp.net mvc 在控制器中创建多对多模型的模式,asp.net-mvc,entity-framework-4.1,Asp.net Mvc,Entity Framework 4.1,我正在使用asp.NETMVC3。我有这样一个场景: 我有用户模型和组模型。一个用户可以有多个组,一个组可以有多个用户。因此,这是一种多对多关系 我有一个UserController和一个GroupController 用户可以创建一个新组 我有存储库模式中描述的UsersRepository和GroupsRepository GroupController具有创建(Group newGroup)操作 一个用户不能有超过10个组 组名必须是唯一的 问题1:要处理限制6,我必须在类用户上实现IVa

我正在使用asp.NETMVC3。我有这样一个场景:

  • 我有用户模型和组模型。一个用户可以有多个组,一个组可以有多个用户。因此,这是一种多对多关系
  • 我有一个UserController和一个GroupController
  • 用户可以创建一个新组
  • 我有存储库模式中描述的UsersRepository和GroupsRepository
  • GroupController具有创建(Group newGroup)操作
  • 一个用户不能有超过10个组
  • 组名必须是唯一的
  • 问题1:要处理限制6,我必须在类用户上实现IValidatableObject,如果用户有10个以上的组,则生成验证错误。但是,由于GroupController的创建操作仅接收组作为参数,因此模型绑定器将永远不会调用User.Validate()

    问题2:处理限制7的唯一方法是针对组存储库中已存在的所有组验证新组名。因此,此验证必须位于GroupsRepository中。我说的对吗

    毕竟,我觉得我做错了什么。我的问题是:在我的场景中,实现现有用户创建新组的最佳方式是什么?我是否应该创建一个像UserGrougViewModel这样的视图模型,并将其传递给GroupController的create操作?或者我应该保持创建(Group newGroup)操作不变,并在UserController上添加CreateGroup(User User User)操作以根据规则6验证用户,然后重定向到GroupController的创建(Group newGroup)操作吗?

    问题1:

    不确定是否要实现IValidatableObject,但您可以在用户存储库中创建一个方法,该方法将返回用户所在的组数。并且,从GroupController的create方法调用此函数。像这样:

    用户存储库


    创建新组时GroupController的使用情况

        UserRepository userRepo= new UserRepository();
        if(userRepo.GetNumberOfGroupsByUserId(id)>10)
        {
          //write code to send error message to view saying the user already has more than 10 groups
        }
    else
    {
     //go ahead and create new group
    }
    
            GroupRepository groupRepo= new GroupRepository();
            if(groupRepo.NameExists(groupName))
            {
              //write code to send error message to view saying a group already exists with same name
            }
        else
        {
         //go ahead and create new group
        }
    
    问题2:

    处理限制7的唯一方法是针对组存储库中已存在的所有组验证新组名。因此,此验证必须位于GroupsRepository中。我说的对吗

    不,验证仍然可以在GroupController(或业务层)中进行。就像在问题1中一样,您可以在GroupRepository中创建一个方法,如果数据库中已经存在组名,则返回
    true
    ,否则返回false。该方法在GroupRepository中类似于此

    public bool NameExists(string groupName)
    {
     int count=0;
    count= context.Groups.Where(g=>g.Name==groupName).Count;
    if (count==0)
    return false;
    else
    return true;
    }
    
    创建新组时GroupController的使用情况

        UserRepository userRepo= new UserRepository();
        if(userRepo.GetNumberOfGroupsByUserId(id)>10)
        {
          //write code to send error message to view saying the user already has more than 10 groups
        }
    else
    {
     //go ahead and create new group
    }
    
            GroupRepository groupRepo= new GroupRepository();
            if(groupRepo.NameExists(groupName))
            {
              //write code to send error message to view saying a group already exists with same name
            }
        else
        {
         //go ahead and create new group
        }
    

    这是一个很好的解决方案,但我个人不喜欢验证控制器内部的操作。此外,请注意,创建新组需要通过将新组添加到用户的组列表来修改用户模型。因此,组控制器的创建操作正在修改用户,这是不好的。这只是一个示例,展示了如何在存储库之外进行验证。您可以在业务层中进行验证。我认为存储库不是进行验证的好地方。我的示例代码根本不修改用户对象。您所说的“因此,组控制器的创建操作正在修改用户,这是不好的…”是什么意思?您将什么称为业务层?正如我所写,这是一种多对多的关系。一个用户有许多组。因此,当用户创建组时,我需要将创建的组添加到用户的组列表中,以便将创建的组固定到用户。这就是全部问题。。。我不知道实现由现有用户创建组的最佳方法。