如何在MySql数据库中使用guid.comb策略
是否可以使用guid.comb策略通过使用Nhibernate的Mysql Db生成身份 当我把它用作如何在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: 标识类
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列(如中所述),并采取步骤避免主键索引中出现碎片。有关详细信息,请参阅。