2016-05-24 5 views
1

У меня есть это настраиваемое репо, и когда я пытаюсь выполнить запрос, он возвращает исключение Если я выполняю запрос с использованием строки 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<>); 
    } 
} 

и вот мое исключение.

enter image description here

Я знаю, что я мог бы сделать все с буквальным запросами, но таким образом я не могу использовать деревья выражений для фильтрации, ни дженерики.

Что я делаю неправильно?

EDIT: 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 Profiler

Вот изображение профиля Sql Server, исполненного Sql. Понятно, что символ '*' пропущен.

enter image description here

Я думаю, что это ошибка конфигурации, поэтому здесь есть класс карте

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


    } 
} 

Еще одно сомнение ... Я знаком с отображением EF, где не нужно сопоставить каждый столбец. Действительно ли это необходимо в Dapper?

+0

Можете ли вы опубликовать запрос, что он говорит о наличии синтаксической ошибки? Я знаю, что вы говорите, что это динамические запросы, но можете ли вы вывести текст каждого запроса, который он создает? –

+0

Unfortunatelly no ... Я не могу захватить сгенерированный sql-запрос ... Я думал об этом ... так что я мог видеть ошибку sql ... Но это не сработало ... – Jedi31

+0

Не могли бы вы предоставить свой ' Объект TableContrato'?Ваша схема объекта может многое объяснить о проблеме, с которой вы столкнулись –

ответ

1

Вам необходимо вызвать AutoMap в своем классе. Как только вы это назовете, AutoMap будет внутренне создавать коллекцию полей и применять их к списку полей в инструкции SQL.

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

    } 
} 
0

Еще одно сомнение ... Я знаком с отображением EF, где мне не нужно, чтобы отобразить каждый столбец. Это действительно необходимо в Dapper?

Нет, просто используйте 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