从数据库检索数据并映射到模型

时间:2019-12-09 15:30:52

标签: c# angular database entity-framework

我有一个指向我的API的“ GET”请求,该请求指向“ MapController”,它促进了“ GetAllProducts”方法。

我希望该方法检索数据库中的所有记录,然后将这些数据作为对象列表返回,然后将其提供给客户端。

我在弄清楚如何将数据库模式映射到我的模型时遇到了一些麻烦。这是我目前的尝试。

控制器类:

    public class MapController : ApiController
    {

        private string SQLServerToUse = "34.255.206.221";
        private string SQLServerDB = "HCT";
        private string SQLServerPWD = "pass";
        private string SQLServerUser = "user";

        public IEnumerable<Map> GetAllProducts()
        {
            //set the connection string
            string connString = "Data Source=" + SQLServerToUse + ";Initial Catalog=" + SQLServerDB + ";User ID=" + SQLServerUser + ";Password=" + SQLServerPWD + ";";

            //variables to store the query results
            List<Map> maps = new List<Map>();

            //sql connection object
            using (SqlConnection connection = new SqlConnection(connString))
            {
                connection.Open(); Console.WriteLine("connection open");
                string query = @"SELECT * FROM dbo.Map";
                using (SqlCommand cmd = new SqlCommand(query, connection))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var map = new Map();
                            map.Map_Data_ID = reader.GetInt32("Map_Data_ID");
                            map.County = reader.GetString("County");
                            map.Color = reader.GetString("Color");
                            maps.Add(map);
                        }

                    }
                }                   
            }

            return maps;
        }         

    }
}

型号:

   public class Map
{
    public string Map_Data_ID { get; set; }
    public string County { get; set; }
    public string Color { get; set; }
}

数据库架构:

enter image description here

呈现给用户界面的预期格式:

[
    {
        "Map_Data_ID": 122,
        "County": "West Yorkshire",
        "Color": "#d45faa"
    },
    {
        "Map_Data_ID": 167,
        "County": "Wiltshire",
        "Color": "#d45faa"
    }
]
如您所见,

期望将int作为参数。 enter image description here

2 个答案:

答案 0 :(得分:3)

根据您的评论,我需要注意一些事项:

  1. 在n层体系结构中,您的控制器不会直接包含数据访问逻辑。取而代之的是,数据访问将包含在另一个类中,该类将(理想情况下)通过依赖注入注入到您的控制器中。
  2. 您可以使用Entity Framework之类的ORM,从而无需在代码中编写原始SQL,而使用LINQ。
  3. 在不使用ORM且不将数据访问逻辑与控制器分离的情况下,您所拥有的就可以了,特别是如果您只是在学习。
  4. 表的ID列是INT类型的事实,但是在Map类中,您的类型为string,这是一个问题。将其更改为int,即可解决该错误。
  5. 无法将字符串转换为int 错误实际上是由GetInt32类型的GetStringSqlDataReader方法接受int作为参数引起的,这是列的序数。因此,如果列0为ID,则将0传递给reader.GetInt32,依此类推。参见here

答案 1 :(得分:0)

如果使用的是Entity Framework,则应首先创建与数据库关联的DbContext,并以正确的方式定义模型类,然后在上下文中创建DbSet。完成所有这些操作后,您可以使用上下文对数据进行CRUD,而不必编写SQL。

有关详细信息,您可以选中here