데이터베이스 테이블 열을 Dapper .Net의 클래스 속성에 매핑하는 방법

.net asp.net-mvc-3 c# dapper sql-server

문제

employee 라는 테이블이 있고 EmpID,FirstName,MiddleName,LastName,Address,EmailID,RegionID,DesgID 및 Dapper .Net 및 SQL Server 데이터베이스 처리를위한 확장을 사용하는 여러 열이 있습니다. Dapper SqlExtensions를 사용하여 기능을 삽입, 업데이트, 삭제하고 Dapper multimapper 옵션을 사용하여 세부 정보를 채 웁니다. 그래서 위의 employee 테이블에 대해 아래 클래스를 사용했습니다.

    [Table("employee")] //To map the table to class
    public class EmployeeModel
    {
        [Key] //Denote primary key
        public Int32 EmpID { get; set; }
        [Column("FirstName")] //Trying to map table column FirstName to variable First (Fails)
        public string First { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string EmailID { get; set; }
        public Int32 RegionID { get; set; }
        public RegionModel Region { get; set; }
        public DesignationModel Designation { get; set; }
        public Int32 DesgID { get; set; }

        public Int32 Add(EmployeeModel Details)
        {
            try
            {
                using (var connection = DBProviderFactory.GetOpenConnection()) //Creating IDbConnection Here
                {
                    return Convert.ToInt32(connection.Insert(Details)); //Using Dapper Extension To Insert New Employee Details
                }
            }
            catch (Exception ex)
            {
                return -1;
            }
        }

        public Int32 Update(EmployeeModel Details)
        {
            try
            {
                using (var connection = DBProviderFactory.GetOpenConnection())
                {
                    return Convert.ToInt32(connection.Update(Details)); //Using Dapper Extension to Update Employee Details
                }
            }
            catch (Exception ex)
            {
                return -1;
            }
        }



        public IEnumerable<EmployeeModel> AllEmployees()
        {
            try
            {
                using (var connection = DBProviderFactory.GetOpenConnection())
                {
                    //Using multi mapper in Dapper to Fill All Employee Details such as region,state,country,designation details etc..
                    string query = @"select e.EmpID,e.FirstName,e.MiddleName,e.LastName,e.Address,e.EmailID
                                     ,r.RegionID as RID,r.Region,s.StateID,s.State,c.CountryID,c.Country,d.DesgID as DID,d.Designation
                                       from employee as e inner join region as r on e.RegionID=r.RegionID
                                           inner join state as s on r.StateID=s.StateID inner join country as c on 
                                               s.CountryID=c.CountryID inner join designation as d on e.DesgID=d.DesgID";
                    return connection.Query<EmployeeModel, RegionModel, StateModel, CountryModel,DesignationModel, EmployeeModel>(query,
                        (employee, region, state, country, designation) =>
                        {
                            employee.Region = region;
                            region.State = state;
                            state.Country = country;
                            employee.Designation = designation;
                            return employee;
                        }, splitOn: "RID,StateID,CountryID,DID");
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

    }

    public class EmployeeModelMapper : ClassMapper<EmployeeModel>
    {
        public EmployeeModelMapper()
        {
            Map(m => m.Region).Ignore();
            Map(m => m.Designation).Ignore();
            Map(m => m.First).Column("FirstName"); //Trying to map table column FirstName to variable First (Fails in the case of Multimapping)
            AutoMap();
        }
    }

위의 예에서 클래스 First 클래스 FirstName 테이블을 매핑하려고했지만 Dapper connection.Query() 사용하여 쿼리를 실행하는 경우 실패합니다. EmployeeModel 클래스의 AllEmployees() 메서드를 참조하십시오.

또한 위의 코드에서 찾을 수있는 Dapper Mapper 확장을 사용하여 시도한 또 다른 옵션은 EmployeeModelMapper 클래스를 참조하십시오.

내 문제:

Dapper 및 Extension에서 일반적으로 사용되는 모든 테이블 열을 클래스 변수에 대응시키는 방법.

인기 답변

Dapper는 기본적으로 ColumnKey 와 같은 속성 속성을 지원하지 않습니다.

여기서 두 가지 옵션을 사용할 수 있습니다. 예를 들어, AS 키워드를 사용하여 결과 집합의 열 이름을 변경하여 가장 간단한 옵션 인 속성 이름과 일치하도록 쿼리를 조정할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using Dapper;
using Newtonsoft.Json;
using Repository.DTO;

namespace Repository.Repositories
{
    public class EmployeeRepo
    {
        public IEnumerable<EmployeeModel> AllEmployees()
        {
            try
            {
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Read"].ConnectionString))
                {
                    const string query = @"select EmpID, FirstName [First] from employee";
                    return connection.Query<EmployeeModel>(query);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(JsonConvert.SerializeObject(e));
                throw;
            }
        }
    }
}

또는 이것이 불가능할 경우 자체 SqlMapper.ITypeMap 구현을 실험 해 볼 수 있습니다.

한 무리의 사람들이 여러 가지 방법으로 이미이 작업을 수행했습니다. 저는 개인적으로 Dapper-FluentMap 의 팬입니다.

이것은 귀하의 DTO 것입니다. 필자는 설정의 용이성을 위해 DTO에 매퍼 설정을 내장했습니다. 리턴 된 컬럼 이름과 다른 컬럼을 맵핑에 나열하면됩니다. 이 예제에서는 EmpId 속성이 결과 집합의 열과 동일한 이름이므로 First 속성 만 필요합니다.

using Dapper.FluentMap.Mapping;

namespace Repository.DTO
{
    public class EmployeeModel
    {
        public int EmpId { get; set; }

        public string First { get; set; }

        public class EmployeeModelMap : EntityMap<EmployeeModel>
        {
            public EmployeeModelMap()
            {
                Map(p => p.First).ToColumn("FirstName");
            }
        }
    }
}

다음 단계는 매핑을 초기화하는 것입니다.

using Dapper.FluentMap;
using Repository.DTO;

namespace Repository
{
    public class Bootstrap
    {
        public static void Map()
        {
            FluentMapper.Initialize(config =>
            {
                config.AddMap(new EmployeeModel.EmployeeModelMap());
            });
        }
    }
}

그럼 그게 다야.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using Dapper;
using Newtonsoft.Json;
using Repository.DTO;

namespace Repository.Repositories
{
    public class EmployeeRepo
    {
        public IEnumerable<EmployeeModel> AllEmployees()
        {
            try
            {
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Read"].ConnectionString))
                {
                    const string query = @"select EmpID, FirstName from employee";
                    return connection.Query<EmployeeModel>(query);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(JsonConvert.SerializeObject(e));
                throw;
            }
        }
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.