【问题标题】:Using Dapper-dot-net, how do I map SQL uniqueidentifier column to a .Net type?使用 Dapper-dot-net,如何将 SQL uniqueidentifier 列映射到 .Net 类型?
【发布时间】:2013-12-19 15:42:14
【问题描述】:

我有一个使用 SQL“uniqueidentifier”类型的现有数据库,它看起来像是与 .Net GUID 不同的 GUID 格式。

问题:使用 Dapper,如何将 SQL uniqueidentifier 列映射到 .Net?

问题: 使用 Dapper-dot-net,当我使用 .Net GUID 类型映射列时,它会编译并运行,但所有 .ToString() 输出都显示相同的错误 GUID。 (嗯,它与我在 SSMS 中看到的不匹配)

当我尝试使用字符串类型映射列时,出现编译器错误。

想法?这可能吗?

【问题讨论】:

    标签: .net tsql dapper


    【解决方案1】:

    啊哈!看来您必须将 SQL 唯一标识符转换为 T-SQL 中的字符串,然后映射到 .Net 中的字符串类型。

    string sql = @"SELECT TOP 100
                   CONVERT(varchar(36), MyIdColumn) AS IdColumnString
                   FROM MyTable";
    
    conn.Query<string>(sql).ToList();
    

    我认为在更新时需要特别注意从 .Net 字符串转换回 T-SQL 唯一标识符,但我还没有测试过这个问题。

    【讨论】:

    • 如果您热衷于转换为 System.String,这绝对是正确的选择。 dapper 中的反射/转换层无法将 UniqueIdentifier 本地转换为 System.String。
    【解决方案2】:

    我还发现我可以将它转换为 T-SQL 中的 varchar,但我想要 .NET 中的实际 GUID 类型。

    使用 Dapper 1.38(也使用 SQL Server 作为底层 RDBMS),如果我将 POCO 属性设置为 Nullable&lt;Guid&gt;,则映射不会有任何问题。 SqlGuid 或字符串不起作用。

    public class MapMe
    {
        public Guid? GuidByDapper { get; set; }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            using (var connection = Utility.GetConnection())
            {
                var mapped = connection.Query<MapMe>("SELECT NEWID() AS GuidByDapper").Single();
                Console.WriteLine("Guid: {0}", mapped.GuidByDapper);
            }
        }
    }
    

    作为控制台应用,它会输出以下内容:

    Guid: 85d17a50-4122-44ee-a118-2a6da2a45461
    

    【讨论】:

    • 所以您是说 TSQL 唯一标识符将映射到 C# nullable
    • 在 Dapper v1.38 中对我有用。
    • 这在 v2.0.78 中对我不起作用。我也不喜欢这个解决方案,因为它需要修改数据模型。我不需要调整数据模型来完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多