是否可以使用guid.comb策略使用Nhibernate生成Mysql的身份?
当我用它作为
mapping.Id(x => x.Id)
.Column("row_guid")
.CustomType(typeof(string))
.GeneratedBy.GuidComb()
.Length(36);我的结果是
-> System.InvalidOperationException :标识类型必须是Guid
有没有办法克服MySql场景中的这个障碍?
编辑:
我在guid和int之间没有选择。这是MSSql遗留数据库的一个端口。
发布于 2010-01-04 07:36:08
这是常见的问题,特别是在将MSSql应用程序移植到MySql时。
正如David所说,实现一个简单的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);发布于 2010-01-03 17:30:37
我不相信在主键中使用不受支持的数据类型是明智的,但是如果您确实需要这样做,那么您可以尝试编写一个NHibernate用户类型,它将其属性公开为Guid,但以字符串形式保存到数据库中。本例中的问题似乎是属性本身被定义为System.Guid以外的数据类型,这是guid.comb策略所期望的。
我不能保证它仍然不会出错,但如果可能的话,这是你让它工作的唯一方法。如果您是NHibernate用户类型的新手,那么就会有一个抽象基类来处理这里的一些苦差事,还有一个示例实现类。你应该能够效仿这个例子。
发布于 2010-01-03 18:55:23
只可以使用System.Guid作为属性的类型。
O/RM是关于映射的,所以即使您的数据库本机不支持给定类型,您仍然可以在域模型中使用它。为了实现BINARY(16)兼容性,您的列的底层类型应该是MySQL。
https://stackoverflow.com/questions/1995579
复制相似问题