如何使用Dapper和ASP.NET MVC建立一对多关系的模型

时间:2018-09-16 21:18:12

标签: asp.net-mvc

我是Dapper甚至ASP.NET MVC的新手,我正在尝试编写应该是非常简单的CRUD应用程序。基本上我有两个表User和File。用户表存储有关用户的一些详细信息,当您单击详细信息时,它应显示更多详细信息以及用户将要上传的任何文件(最多可以包含10个文件)。

文件表存储文件名。如何创建模型,然后使用Dapper查看类似内容。看起来很简单,但我似乎无法弄清楚。我可以将两个模型都放在视图中,然后遍历文件模型以显示文件(如果有)。如果可以,怎么办?

这是我的详细信息控制器。

public ActionResult Details(int id)
    {
        Users user = new Users();
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myconn"].ConnectionString))
        {
            user= db.Query<Users>("SELECT * FROM Users As t LEFT JOIN Files AS f ON  t.EID = f.EID WHERE t.EID=" +id, new{ id }).SingleOrDefault() ;
        }
        return View(trade);
    }

1 个答案:

答案 0 :(得分:0)

首先,尝试阅读有关体系结构的更多信息,首先学习如何组织代码。例如,直接从控制器调用数据库是一个坏主意。我会做这样的事情:

根据职责将所有数据库调用移动到单独的存储库类。

final String details = getItem(position);
    ViewHolder viewHolder;
    ViewHolder mainViewHolder = null;
    if(convertView == null){
        LayoutInflater inflater = LayoutInflater.from(getContext());
        //...
        //others codes
        //...
        ViewHolder.dealInfo.setText(details);//ADD THIS LINE
        convertView.setTag(viewHolder);
    }

创建模型以存储数据以查看详细信息

public class UsersRepository
{
    public User GetUser(int id)
    {
        User user = new User();
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myconn"].ConnectionString))
        {
            user= db.Query<User>("SELECT * FROM Users where EID=@id", new{ id }).SingleOrDefault();
        }
        return user;
    }

    public List<File> GetUserFiles(int id)
    {
        List<File> files = new List<File>();
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myconn"].ConnectionString))
        {
            files = db.Query<File>("SELECT * FROM Files where UserID=@id", new{ id });
        }
        return files;
    }
}

创建服务或引擎以组织业务逻辑

public class UserDetails
{
    public User User { get; set; }
    public List<File> Files { get; set; }
}

在控制器中调用

public class UsersService
{   
    private UsersRepository _usersRepository;

    public UsersService()
    {
        _usersRepository = new UsersRepository();
    }

    public UserDetails GetUserDetails(int userId)
    {
        var details = new UserDetails();
        details.User = _usersRepository.GetUser(id);
        details.Files = _usersRepository.GetUserFiles(id);
        return details;     
    }       
}

但是请记住,它是非常简化的示例。例如,最好使用依赖注入而不是在构造函数中初始化服务或存储库。同样,在许多情况下,对于视图和存储库逻辑使用相同的类并不是很明智,请考虑在本地使用DTO和域类。对于简单的应用程序和演示,应该没问题。