Ceci est ma première expérience avec Dapper.Contrib (dernière version de Nuget) et c'est une situation étrange:
using (SqlConnection cn = new SqlConnection(connectionString))
{
cn.Open();
var product = cn.Get<Product>(1);
}
Sur SqlMapperExtensions, il déclenche l'erreur 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))
}
La base de données reçoit la commande select * from Products where Id = @id
est incorrect.
s
à Product? J'ai essayé avec d'autres tables et j'ai obtenu le même résultat.
Il semble que ce soit écrit de cette façon, vous pouvez vérifier le code source
Ou plus précisément:
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);
}
}
Si vous souhaitez utiliser le nom de type littéral, vous pouvez facilement le configurer.
SqlMapperExtensions.TableNameMapper = (type) => {
//use exact name
return type.Name;
};
Il est conçu de cette façon. Vous pouvez remplacer le comportement par défaut en décorant vos classes Dapper.Contrib.Extensions.TableAttribute
avec Dapper.Contrib.Extensions.TableAttribute
.
using Dapper.Contrib.Extensions;
[Table("Product")]
public class Product
{
...
}