2016-05-24 101 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

相關問題