Dapper sqlmapperextensions会自动添加" s"到tablename?

时间:2014-12-07 08:45:40

标签: c# dapper

这是我第一次使用 Dapper.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附加到产品?

我已尝试过其他表并获得相同的结果。

2 个答案:

答案 0 :(得分:15)

这是这样设计的。您可以通过使用Dapper.Contrib.Extensions.TableAttribute修饰 POCO类来覆盖默认行为。

using Dapper.Contrib.Extensions;

[Table("Product")]
public class Product
{
...
}

答案 1 :(得分:6)

似乎用这种方式编写,您可以查看 source code

或更具体地说:

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