我有这个自定义仓库,当我尝试执行查询时,它会返回一个异常 如果我使用sql字符串执行查询,它不会返回错误,但是当我使用一些扩展时,我有这个例外。
像这样:
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 profiler
这是执行Sql的Sql Server Profile的图像。 显然,错过了'*'字符。
我认为是配置错误,所以这里是地图类
public class TableContratoMap : ClassMapper<TableContrato>
{
public TableContratoMap()
{
// ReSharper disable once RedundantBaseQualifier
base.Table("Contrato");
}
}
还有一个疑问......我熟悉EF映射,我不需要映射每一列。 在Dapper真的有必要吗?
答案 0 :(得分:1)
您需要在班级映射器中调用AutoMap。一旦调用它,AutoMap将在内部构建字段集合并将其应用于SQL语句中的字段列表。
public class TableContratoMap : ClassMapper<TableContrato>
{
public TableContratoMap()
{
// ReSharper disable once RedundantBaseQualifier
base.Table("Contrato");
AutoMap();
}
}
答案 1 :(得分:0)
还有一个疑问......我熟悉EF映射,我不需要映射每一列。在Dapper真的有必要吗?
不要只在数据库中使用dapper contrib和相同的名称作为代码。
Table Persons
Id
Name
Birth
Class Persons
Id
Name
Birth
var person = dapper.Get<Persons>(22);