首页 > 解决方案 > 如何编写一个 Web api 来处理与 c# 中的外键连接的表?

问题描述

我正在尝试为学生表和学生所学的课程编写一个 web api。控制器单独工作正常。我的意思是获取、发布、放置和删除方法正在工作。

学生表有一个 id 作为主键、一个名称和课程

课程表有一个 id 作为主键,学生 id 作为外键和课程名称

模型类是

    public class Student
    {
        public int id { get; set; }
        public string name{ get; set; }
        public ICollection<Courses> Courses { get; set; } 
    }

    public class Courses
    {
        public int id { get; set; }
        public int studentid { get; set; }
        public string name{ get; set; }
    }

我正在从事的项目是一个 .net web api 项目。我为学生写的post方法如下

        try
        {
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (var cmd = new SqlCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "insert into student (name) " +
                        "values (@name)";

                    cmd.Connection = connection;
                    cmd.Parameters.AddWithValue("@name", student.name);

                    cmd.ExecuteNonQuery();
                }
            }
        }
        catch (SqlException ex)
        {

            Debug.WriteLine(ex.Message);
        }

这是我的问题。如何在考虑外键的情况下编写我的方法?我找不到任何代码示例。它们都是用于实体框架...

标签: c#.netasp.net-web-api

解决方案


例如,要获取您可以使用的所有学生和课程:

[HttpGet]
public ActionResult<StudentViewModel> GetAllStudents()
{
        try
        {
            using (var connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (var cmd = new SqlCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.CommandText = "SELECT s.id, s.name, c.Name as courseName FROM Student s INNER JOIN Courses c on c.studentId = s.id";
                    cmd.Connection = connection;


                    SqlDataAdapter da = new SqlDataAdapter(cmd);

                    da.Fill(dataTable);
                    connection.Close();
                    da.Dispose();

                    //Fill result view model from dataTable which will contain all data which you want from DB. 
                }
            }
        }
        catch (SqlException ex)
        {
            //Log exception
        }
}

但这只是样本。在现实世界中,最好将控制器中的操作和用于获取数据的业务逻辑之间的逻辑分开。而使用 EntityFramework 之类的对象关系映射 (ORM) 将节省大量时间。如果您需要使用自定义查询,您将有可能这样做。


推荐阅读