【问题标题】:How do I use the guid.comb strategy in a MySql db如何在 MySql 数据库中使用 guid.comb 策略
【发布时间】:2011-01-01 00:31:01
【问题描述】:

是否可以使用 guid.comb 策略通过使用 Nhibernate 的 Mysql Db 生成身份?

当我把它当作

   mapping.Id(x => x.Id)
        .Column("row_guid")
        .CustomType(typeof(string))
        .GeneratedBy.GuidComb()
        .Length(36);

我最终得到了一个

----> System.InvalidOperationException : 身份类型必须是 Guid

有没有办法在 MySql 场景中克服这个障碍?

编辑:
我在 guidint 之间没有选择。这是来自 MSSql 的遗留数据库的端口

【问题讨论】:

  • 为什么要用字符串类型来存储guid?
  • MySQL 不支持原生 GUID 存储。
  • 为什么不是数字,字符串查找要慢很多

标签: mysql nhibernate orm fluent-nhibernate guid


【解决方案1】:

我不相信使用不受支持的数据类型作为主键是否明智,但如果您确实需要这样做,那么您可以尝试编写一个 NHibernate 用户类型,将其属性作为 Guid 公开但坚持数据库作为字符串。这种情况下的问题似乎是属性本身被定义为 System.Guid 以外的数据类型,这是 guid.comb 策略所期望的。

我不能保证它仍然不会出错,但如果可能的话,这是让它工作的唯一方法。如果您是 NHibernate 用户类型的新手,那么有一个抽象基类可以为您处理一些苦差事here,并带有一个示例实现类。你应该可以按照这个例子来。

【讨论】:

    【解决方案2】:

    只可以使用System.Guid作为属性的类型。

    O/RM 是关于映射的,因此即使您的数据库本身不支持给定类型,您仍然可以在域模型中使用它。为了与 MySQL 兼容,您的列的基础类型应为 BINARY(16)

    【讨论】:

      【解决方案3】:

      这是一个常见问题,尤其是在将 MSSql 应用程序移植到 MySql 时。
      正如大卫所说,实现一个简单的 CustomIdGenerator ,它是GuidCombGenerator 的包装器,它将Guid 作为字符串提供给您。

      using NHibernate.Engine;
      using NHibernate.Id;
      
      namespace NHibernateMaps
      {
        public class GuidStringGenerator : IIdentifierGenerator
        {
          public object Generate(ISessionImplementor session, object obj)
          {
            return new GuidCombGenerator().Generate(session, obj).ToString();
          }
      
        }
      }
      

      并在映射中指定为

       mapping.Id(x => x.Id)
          .Column("row_id")
          .CustomType(typeof(string))
          .GeneratedBy.Custom(typeof(GuidStringGenerator))
          .Length(36);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多