如何在Dapper .Contrib中获取具有更改跟踪的对象?

时间:2016-09-02 03:39:22

标签: orm dapper

我一直在使用Dapper-Contrib,并且在使用.Get检索对象时遇到问题,以便我可以维护对象的更改跟踪。

我的界面:

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

在调用上述功能时,我收到错误消息无效的对象名称&#39;国家&#39;

问题似乎是由Dapper引起的,sqlmapperextensions会自动将“s”添加到tablename,这可以通过定义TableAttribute来解决。但是,TableAttribute仅支持类,但不支持接口。

请注意,我必须使用界面拨打.Get以获得跟踪功能。

1 个答案:

答案 0 :(得分: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。

希望这有帮助!