代码之家  ›  专栏  ›  技术社区  ›  Nathan Fisher

nhibernate、mysql和guid的问题

  •  4
  • Nathan Fisher  · 技术社区  · 15 年前

    我有一个视图,它将四个表的层次结构展平,显示为一个报告。在视图中,它包含每个表的主键(guid)以及一些显示数据。

    问题是guid被返回为varbinary(16)而不是binary(16),结果nhibernate抛出了一个错误。这对我来说似乎是一样的,但也许我错过了什么。

    guid应包含32位数字和4个破折号(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX)。

    我已经尝试将respect binary flags=true;添加到配置字符串中,所做的一切似乎都会影响常规类是否工作。

    这一次让我很困惑。我将把主键还原为整数作为最后的手段。

    2 回复  |  直到 12 年前
        1
  •  1
  •   Jalal El-Shaer    14 年前

    这是MySQL.NET连接器中的一个错误。有关详细信息,请查看此错误报告。 http://bugs.mysql.com/bug.php?id=52747

    更新: 在版本6.1.1之后,无论何时使用二进制(16)作为存储类型,都应将“old guids=true”添加到连接字符串中。否则应使用char(36)

        2
  •  3
  •   usr-local-ΕΨΗΕΛΩΝ    12 年前

    解决方案:创建自定义方言

    public class MySQL5GuidFixDialect
        : MySQL5Dialect
    {
    
        public MySQL5GuidFixDialect()
        {
            RegisterColumnType(DbType.Guid, "CHAR(36)");
        }
    }
    

    别忘了在nhibernate配置中配置它。相对于varchar,我更喜欢char,因为它对固定长度的字段使用(或应该使用)静态alloc而不是动态alloc