Dapper sqlmapperextensions автоматически добавляет "s" в tablename?
Это мой первый опыт работы с щеголь.Contrib (последняя версия от Nuget) и это странная ситуация:
using (SqlConnection cn = new SqlConnection(connectionString))
{
cn.Open();
var product = cn.Get<Product>(1);
}
На SqlMapperExtensions, он вызывает ошибку Invalid object name 'Products':
public static T Get<T>(this IDbConnection connection,
dynamic id,
IDbTransaction transaction = null,
int? commandTimeout = null) where T : class
{
var type = typeof(T);
string sql;
if (!GetQueries.TryGetValue(type.TypeHandle, out sql))
}
База данных получает команду select * from Products where Id = @id, которая неверна.
Почему он добавляет s к продукту?
Я пробовал с другими таблицами и получил тот же результат.
3 ответов:
Похоже, что это написано таким образом, вы можете проверить исходный код
Или более конкретно:
private static string GetTableName(Type type) { //.... codes if (TableNameMapper != null) { name = TableNameMapper(type); } else { var tableAttr = //.... lookup attribute if (tableAttr != null) name = tableAttr.Name; else { name = type.Name + "s"; if (type.IsInterface() && name.StartsWith("I")) name = name.Substring(1); } }Если вы хотите использовать имя литерального типа, вы можете легко настроить его.
SqlMapperExtensions.TableNameMapper = (type) => { //use exact name return type.Name; };
Оно определено таким образом. Вы можете переопределить поведение по умолчанию, украсив свои классы POCO
Dapper.Contrib.Extensions.TableAttribute.using Dapper.Contrib.Extensions; [Table("Product")] public class Product { ... }
Ваш ответ великолепен, хотя это не очень хорошая практика, чтобы иметь Dapper зависимость от сборки POCO Щеголь будет счастлив, если вы это сделаете использование системы.ComponentModel.DataAnnotations.Схема; вместо с помощью щеголя.ВНО.Расширения
Comments