在NHibernate中为主键列生成顺序Id

时间:2016-10-31 19:10:02

标签: c# nhibernate nhibernate-mapping mapping-by-code

如何在NHibernate中为主键列生成Sequential guid。我知道怎么做自动增量的东西。但我不知道如何为主键创建顺序Guid。

在数据库中,Id列的数据类型为uniqueidentifier。我查看了官方文档和其他一些网络搜索结果。但我无法找到任何解决方案。这就是我现在所拥有的:

public UserMap()
{
    Table("Users");
    Id(x => x.Id);
    Property(x => x.Username, x => x.NotNullable(true));
    Property(x => x.Email, x => x.NotNullable(true));
    Property(x => x.PasswordHash, x =>
    {
        x.NotNullable(true);
        x.Column("password_hash");
    });
}

2 个答案:

答案 0 :(得分:2)

我是这样做的:

在我的业务实体类

public abstract class EntityBase : IEntity
{
    public virtual Guid Id { get; protected set; }
    ...
}

流畅的映射:

Id(x => x.Id).GeneratedBy.GuidComb();

阅读关于Guid.comb的this

答案 1 :(得分:1)

查看Adam Bar的文档

Mapping-by-Code - Id, NaturalId

让我引用:

  

最常见的主键映射可通过Id方法获得。

Id(x => x.Id, m =>
{
    m.Column("id");

    m.Generator(Generators.Native, g => g.Params(new
    {
        // generator-specific options
    }));

    m.Length(10);
    m.Type(new Int32Type());
    m.Access(Accessor.Field);
});
     

缺少一些功能 - 例如未保存的值(将添加   在NHibernate 3.3)或DDL列选项中。

     

可能最重要的选项是Generator。它指明了方式   NHibernate(或数据库)生成唯一值。有8个   通过静态生成器可用的预定义类型的生成器   类:

public static class Generators
{
    ...

    // Guid
    public static IGeneratorDef Guid { get; }

    // sequential Guid
    public static IGeneratorDef GuidComb { get; }

因此,基于此,我们可以调整映射:

public UserMap()
{
    Table("Users");
    Id(x => x.Id, m =>
    {
        m.Generator(Generators.GuidComb);
    }
    ...
相关问题