2016-09-02 4 views
0

Я играл с Dapper-Contrib немного и имею проблему с возвратом объекта с использованием .Get, чтобы я мог поддерживать отслеживание изменений для объекта.Как получить объект с отслеживанием изменений в Dapper .Contrib?

Мой Интерфейс:

Imports Dapper.Contrib.Extensions 

Public Interface ICountry 

    <Key> 
    Property CountryGUID As Guid 
    Property Country As String 

End Interface 

Класс:

Imports Dapper.Contrib.Extensions 

<Table("Country")> 
Public Class Country 
    Implements ICountry 
    <Key> 
    Public Property CountryGUID As Guid Implements ICountry.CountryGUID 
    Public Property Country As String Implements ICountry.Country 

End Class 

Моя функция:

Public Function Find(countryId As Guid) As ICountry 
     Dim country As ICountry 

     Using conn = New SqlConnection(ConnectionString) 
      conn.Open() 

      country = conn.Get(Of ICountry)(countryId) 

      conn.Close() 
     End Using 

     Return country 
    End Function 

И я получил ошибку говоря Invalid имя объекта 'Countrys' при вызове вышеуказанная функция.

Проблема заключается в том, что Dapper sqlmapperextensions автоматически добавляет «s» в tablename и может быть решена путем определения TableAttribute. Однако TableAttribute поддерживается только для классов, но не для интерфейсов.

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

ответ

0

У меня была точно такая же проблема и удалось обойти ее.

Глядя на комплект тестов Dapper Contrib, я нашел this code. Поэтому я создал функцию для изменения отображения таблицы

private static void ConfigureTableMapper() 
{ 
    if (SqlMapperExtensions.TableNameMapper != null) 
     return; 

    SqlMapperExtensions.TableNameMapper = (type) => 
    { 
     var tableattr = type.GetCustomAttributes(false).SingleOrDefault(attr => attr.GetType().Name == "TableAttribute") as dynamic; 
     if (tableattr != null) 
      return tableattr.Name; 

     var name = type.Name; 
     if (type.IsInterface && name.StartsWith("I")) 
      name = name.Substring(1); 
     return name; 
    }; 
} 

Это код C#, но его необходимо легко преобразовать в VB.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^