2016-05-24 33 views
1

我有这样的习俗回购,当我尝试执行查询时,如果我执行使用SQL查询字符串返回一个异常 ,它不返回一个错误,但是当我使用一些extention那么我有这个例外。附近有语法错误关键字“从”

像这样:

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

,这里是我的例外。

enter image description here

我知道我可以用文字的查询做,但这种方式我不能用表达式树进行过滤,无论是仿制药。

我在做什么错了?

编辑: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; } 

} 

更新 - 31/05/2016 - SQL事件探查器

这里是Sql Server的配置文件的图像执行的SQL。 Aparently中, '*' 字符被错过。

enter image description here

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

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


    } 
} 

还有一个疑问......我熟悉EF映射,在这里我不需要映射每一列。 难道是真的小巧玲珑neccessary?

+0

你可以发表查询,它说有一个语法错误?我知道你说这些是动态查询,但你可以让它输出它构建的每个查询的文本? –

+0

可惜的是没有...我无法捕捉生成的SQL查询...我想那个......所以我可以看到SQL错误...但是,它没有工作... – Jedi31

+0

能否请您提供您的' TableContrato'对象?您的对象模式可能会解释很多关于您正在编辑的问题 –

回答

1

你需要你的类映射器中调用自动地图。一旦你调用它,AutoMap将在内部建立字段集合并将其应用到SQL语句中的字段列表中。

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

    } 
} 
0

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

不只是用短小精悍的contrib和相同的名称以dB为代码。

Table Persons 
Id 
Name 
Birth 

Class Persons 
Id 
Name 
Birth 

var person = dapper.Get<Persons>(22); 
+0

您并不总是必须在DapperExtensions中映射所有列,但是如果替换默认的映射器,那么您需要执行原始映射器将执行的基本任务。 Contrib以不同的方式解决了对CRUD方法的需求,但需要实体类的属性。 –

+0

你可以使用属性,但你不必如果yopu遵循https://github.com/StackExchange/dapper-dot-net/tree/master/Dapper.Contrib – dbol

相关问题