1

我有这个自定义 repo,当我尝试执行查询时,它返回异常

像这样:

public override IEnumerable<TableContrato> All()
{
    //var query = "select * from Contrato";
    //var data = Conn.Query<TableContrato>(query);
    var data = Conn.GetList<TableContrato>();
    return data;
}

我所有的实体都是在 c# 中使用“表”前缀创建的,比如TableContrato,我的表被称为Contrato

这样,我就构建了一个自定义映射器,就像这样。

public class CustomMapper<TTableEntity>  : PluralizedAutoClassMapper<TTableEntity> where TTableEntity : class
{
    public override void Table(string tableName)
    {
        tableName = tableName.Replace("Table", string.Empty).Trim();
        base.Table(tableName);
    }
}

这是我的回购基地

public abstract class ReadOnlyRepositoryBase<TEntity, TTable, TKey> : IReadOnlyRepository<TEntity, TKey>
    where TEntity : class where TTable : class
{
    protected IDbConnection Conn { get; set; }
    protected DapperContext Context { get; private set; }

    protected ReadOnlyRepositoryBase()
    {
        Context = new DapperContext();
        Conn = Context.Connection;
        InicializaMappings();
    }

    public void InicializaMappings()
    {
        global::DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomMapper<>);
    }
}

这是我的例外。

在此处输入图像描述

我知道我可以用文字查询来做所有事情,但是这样我就不能使用表达式树进行过滤,也不能使用泛型。

我做错了什么?

编辑:26/05/2015 - TableContrato

public class TableContrato
{
    public Guid ContratoId { get; set; }

    public Guid EmpresaId { get; set; }

    public string ContratoNome { get; set; }

    public string ContratoCodigo { get; set; }

    public DateTime? DataDeCriacao { get; set; }

    public Guid? UsuarioQueCriou { get; set; }

    public TableEmpresaGrupo Empresa { get; set; }

    public virtual ICollection<TableLocal> Locais { get; set; }

}

更新 - 2016 年 5 月 31 日 - Sql 分析器

这是执行 Sql 的 Sql Server Profile 的图像。显然,'*' 字符被遗漏了。

在此处输入图像描述

我认为是配置错误,所以这里是地图类

public class TableContratoMap : ClassMapper<TableContrato>
{
    public TableContratoMap()
    {
        // ReSharper disable once RedundantBaseQualifier
        base.Table("Contrato");


    }
}

还有一个疑问......我熟悉 EF 映射,我不需要映射每一列。在 Dapper 中真的有必要吗?

4

2 回答 2

1

您需要在类映射器中调用 AutoMap。一旦调用它,AutoMap 将在内部构建字段集合并将其应用于 SQL 语句中的字段列表。

public class TableContratoMap : ClassMapper<TableContrato>
{
public TableContratoMap()
   {
       // ReSharper disable once RedundantBaseQualifier
       base.Table("Contrato");
       AutoMap();

   }
}
于 2016-06-02T12:12:25.557 回答
0

还有一个疑问......我熟悉 EF 映射,我不需要映射每一列。在 Dapper 中真的有必要吗?

不只是在 db 中使用 dapper contrib 和相同的名称作为代码。

Table Persons
Id
Name
Birth

Class Persons
Id
Name
Birth

var person = dapper.Get<Persons>(22);
于 2016-09-29T08:14:52.553 回答