Columna de asignación de Dapper con una propiedad en el modelo que tiene un nombre y tipo diferente

dapper mapping sqlclient sql-server-2008-r2 stored-procedures

Pregunta

Tengo un modelo de este modelo:

 public class Member
    {
        #region public property

        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public AccountState AccountState { get; set; }
        public GodFatherType GodFatherType { get; set; }
}

AccountState y GodFatherType son ambos 2 eumerates:

 public enum AccountState 
{
    NotActivated = 0,
    Activated = 1,
    Desactived = 2,

}

 public enum GodFatherType
    {
        Undefined=0,
        unknown = 1,
        Correct = 2,
    }

En la base de datos que tengo Id, LastName, FistName, TinyInt AccountstateId et smallint GodFatherTypeid, no me gustaría cambiar mi procedimiento almacenado, ¿cómo puedo asignar My Class Member con la base de datos?

En realidad, solo obtengo los atributos Id, LastName, FistName cuando ejecuto mi procedimiento almacenado con este código:

 public sealed class DbContext : IDbContext
{
    private bool disposed;
    private SqlConnection connection;

    public DbContext(string connectionString)
    {
        connection = new SqlConnection(connectionString);
    }

    public IDbConnection Connection
    {
        get
        {
            if (disposed) throw new ObjectDisposedException(GetType().Name);

            return connection;
        }
    }

    public IDbTransaction CreateOpenedTransaction()
    {
        if (connection.State != ConnectionState.Open)
            Connection.Open();
        return Connection.BeginTransaction();
    }

    public IEnumerable<T> ExecuteProcedure<T>(string procedure, dynamic param = null, IDbTransaction transaction = null)
    {
        if (connection.State == ConnectionState.Closed)
        {
            connection.Open();
        }

        return Dapper.SqlMapper.Query<T>(connection, procedure, param, transaction,
            commandType: CommandType.StoredProcedure);
    }

    public int ExecuteProcedure(string procedure, dynamic param = null, IDbTransaction transaction = null)
    {
        if (connection.State == ConnectionState.Closed)
        {
            connection.Open();
        }

        return Dapper.SqlMapper.Execute(connection, procedure, param, transaction,
            commandType: CommandType.StoredProcedure);
    }

    public void Dispose()
    {
        Debug.WriteLine("** Disposing DbContext");

        if (disposed) return;

        if (connection != null)
        {
            connection.Dispose();
            connection = null;
        }

        disposed = true;
    }
}

Respuesta aceptada

La opción más fácil es mantenerlos 1: 1, es decir,

public AccountState AccountStateId { get; set; }
public GodFatherType GodFatherTypeId { get; set; }

dónde

public enum AccountState : byte {...}
public enum GodFatherType : short {...}

Si el cambio de nombre de las propiedades no es posible, tal vez agregue propiedades shim:

private byte AccountStateId {
    get { return (byte)(int)AccountState; }
    set { return AccountState = (AccountState)(int)value; }
}

También es posible cambiar el nombre de los miembros en el mapa, pero eso es más complicado.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow