Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dapper sqlmapperextensions automatically adds "s" to tablename?

Tags:

c#

dapper

This is my first experience with Dapper.Contrib (latest version from Nuget) and it's a strange situation:

using (SqlConnection cn = new SqlConnection(connectionString))
{
    cn.Open();
    var product = cn.Get<Product>(1);
}

On SqlMapperExtensions, it raises the error 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))
}

The database receives the command select * from Products where Id = @id which is wrong.

Why does it append s to Product?

I've tried with other tables and get the same result.

like image 893
nam vo Avatar asked Dec 07 '14 08:12

nam vo


2 Answers

It is desgined this way. You can override the default behavior by decorating your POCO classes with Dapper.Contrib.Extensions.TableAttribute.

using Dapper.Contrib.Extensions;

[Table("Product")]
public class Product
{
...
}
like image 58
Farzan Hajian Avatar answered Sep 19 '22 13:09

Farzan Hajian


It seems that it's written this way, you can check the source code

Or more specifically:

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);
        }
    }

If you want to use the literal type name you can easily configure this.

SqlMapperExtensions.TableNameMapper = (type) => {
    //use exact name
    return type.Name;
};
like image 36
Dimitar Dimitrov Avatar answered Sep 23 '22 13:09

Dimitar Dimitrov