Cómo asignar columnas de tabla de base de datos a propiedades de clase en Dapper .Net

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

Pregunta

Tengo una tabla llamada employee y tengo varias columnas como EmpID,FirstName,MiddleName,LastName,Address,EmailID,RegionID,DesgID y estoy usando Dapper .Net y extensiones para tratar con la base de datos de SQL Server. Yo uso Dapper SqlExtensions para insertar, actualizar, eliminar funcionalidad y usar la opción de Dapper multimapper para completar los detalles. Así que utilicé la clase inferior para la tabla de employee anterior

    [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();
        }
    }

En el ejemplo anterior, estoy intentando FirstName columna FirstName de la tabla a la variable de la clase First pero falla en el caso de ejecutar Query usando la connection.Query() Dapper. Query connection.Query() refiere el método AllEmployees() en la clase EmployeeModel .

También otra opción que probé con la extensión Dapper Mapper, que también se puede encontrar en el código anterior, consulte la clase EmployeeModelMapper .

Mi problema:

Cómo asignar todas las columnas de la tabla a sus correspondientes variables de clase para uso común en Dapper y extensiones.

Respuesta popular

Dapper de forma predeterminada no admite atributos de propiedad como Column y Key .

Aquí tiene dos opciones, ajuste su consulta para usar la palabra clave AS para cambiar el nombre de las columnas en el conjunto de resultados para que coincida con los nombres de sus propiedades, que es la opción más simple.

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;
            }
        }
    }
}

O si esto no es posible, puede experimentar proporcionando su propia implementación de SqlMapper.ITypeMap.

Un montón de gente ya ha hecho esto de diferentes maneras. Personalmente soy fan de Dapper-FluentMap .

Este sería tu DTO. He incrustado la configuración de mapper en el DTO para facilitar la configuración. Tenga en cuenta que solo necesita enumerar las columnas en la asignación que son diferentes de los nombres de columna que se devuelven. En nuestro ejemplo, solo se necesita la First propiedad, ya que la propiedad EmpId tiene el mismo nombre que la columna en el conjunto de resultados.

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");
            }
        }
    }
}

El siguiente paso es inicializar su mapeo.

using Dapper.FluentMap;
using Repository.DTO;

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

Entonces eso es todo.

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;
            }
        }
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué