如何在MySql数据库中使用guid.comb策略

如何在MySql数据库中使用guid.comb策略,mysql,nhibernate,orm,fluent-nhibernate,guid,Mysql,Nhibernate,Orm,Fluent Nhibernate,Guid,是否可以使用guid.comb策略通过使用Nhibernate的Mysql Db生成身份 当我把它用作 mapping.Id(x => x.Id) .Column("row_guid") .CustomType(typeof(string)) .GeneratedBy.GuidComb() .Length(36); 我最终得到了一份工作 --> System.InvalidOperationException: 标识类

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

当我把它用作

   mapping.Id(x => x.Id)
        .Column("row_guid")
        .CustomType(typeof(string))
        .GeneratedBy.GuidComb()
        .Length(36);
我最终得到了一份工作

--> System.InvalidOperationException: 标识类型必须为Guid

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

编辑:
我无法在guid和int之间进行选择。这是MSSql遗留数据库的一个端口,我不相信在主键中使用不受支持的数据类型是否明智,但如果确实需要这样做,则可以尝试编写一个NHibernate用户类型,将其属性作为guid公开,但作为字符串持久化到数据库。本例中的问题似乎是属性本身被定义为System.Guid以外的数据类型,而Guid.comb策略需要这种数据类型


我不能保证它仍然不会出错,但如果可能的话,这是让它工作的唯一方法。如果您是NHibernate用户类型的新手,那么有一个抽象基类负责您的一些繁重工作,并提供了一个示例实现类。您应该能够遵循此示例。

我不相信对主键使用不受支持的数据类型是否明智,但如果确实需要这样做,则可以尝试编写一个NHibernate用户类型,该类型将其属性公开为Guid,但将其作为字符串持久化到数据库。本例中的问题似乎是属性本身被定义为System.Guid以外的数据类型,而Guid.comb策略需要这种数据类型

我不能保证它仍然不会出错,但如果可能的话,这是让它工作的唯一方法。如果您是NHibernate用户类型的新手,那么有一个抽象基类负责您的一些繁重工作,并提供了一个示例实现类。您应该能够遵循此示例。

只需使用System.Guid作为属性类型即可

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

只需使用System.Guid作为属性类型即可


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

这是一个常见问题,尤其是在将MSSql应用程序移植到MySQL时。 正如David所说,实现一个简单的CustomIdGenerator,它是一个包装器,将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);

这是一个常见的问题,尤其是在将MSSql应用程序移植到MySql时。 正如David所说,实现一个简单的CustomIdGenerator,它是一个包装器,将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);

为什么要使用字符串类型来存储guid?MySQL不支持本机guid存储。为什么不使用数字,字符串查找速度要慢很多?为什么要使用字符串类型来存储guid?MySQL不支持本机guid存储。为什么不使用数字,字符串查找速度要慢很多如果您有很多行、存储大小和/或性能问题,您应该将GUI持久化在BINARY16列中(如中所述),并采取措施避免主键索引中出现碎片。有关详细信息,请参阅。如果有很多行、存储大小和/或性能问题,则应将GUI持久化为BINARY16列(如中所述),并采取步骤避免主键索引中出现碎片。有关详细信息,请参阅。