流畅的nHibernate,Hi-Lo表,每行使用一个实体

hey*_*uss 5 nhibernate fluent-nhibernate

有没有办法指定一个用于Hi-Lo值的表,每个实体都有一个每行条目,通过约定(虽然仍然有nHibernate为你创建表结构)?我想复制Phil Haydon在这里写的内容,但无需手动管理表格.就目前而言,只有当您已经在表中为"TableKey"创建了适当的条目时,才将其每行代码行迁移到它自己的约定.

或者,这可以通过XML映射吗?

如果一切都失败了,是使用自定义的生成,一拉唯一的其他选择相应的选项这篇文章

Mir*_*vic 9

Fabio Maulo 在他的一个代码映射帖子中谈到了这一点.

按代码示例映射:

mapper.BeforeMapClass += (mi, type, map) =>
    map.Id(idmap => idmap.Generator(Generators.HighLow,
        gmap => gmap.Params(new
        {
            table = "NextHighValues",
            column = "NextHigh",
            max_lo = 100,
            where = string.Format(
                "EntityName = '{0}'", type.Name.ToLowerInvariant())
        })));
Run Code Online (Sandbox Code Playgroud)

对于FluentNHibernate,您可以执行以下操作:

public class PrimaryKeyConvention : IIdConvention
{
    public void Apply(IIdentityInstance instance)
    {
        var type = instance.EntityType.Name;
        instance.Column(type + "Id");
        instance.GeneratedBy.HiLo(type, "NextHigh", "100", 
            x => x.AddParam("where", String.Format("EntityName = '{0}'", type));
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,Fabio解释了如何使用IAuxiliaryDatabaseObject创建Hi-Lo脚本.

private static IAuxiliaryDatabaseObject CreateHighLowScript(
    IModelInspector inspector, IEnumerable<Type> entities)
{
    var script = new StringBuilder(3072);
    script.AppendLine("DELETE FROM NextHighValues;");
    script.AppendLine(
        "ALTER TABLE NextHighValues ADD EntityName VARCHAR(128) NOT NULL;");
    script.AppendLine(
        "CREATE NONCLUSTERED INDEX IdxNextHighValuesEntity ON NextHighValues " 
        + "(EntityName ASC);");
    script.AppendLine("GO");

    foreach (var entity in entities.Where(x => inspector.IsRootEntity(x)))
    {
        script.AppendLine(string.Format(
         "INSERT INTO [NextHighValues] (EntityName, NextHigh) VALUES ('{0}',1);",
         entity.Name.ToLowerInvariant()));
    }

    return new SimpleAuxiliaryDatabaseObject(
        script.ToString(), null, new HashedSet<string> {
           typeof(MsSql2005Dialect).FullName, typeof(MsSql2008Dialect).FullName 
        });
}
Run Code Online (Sandbox Code Playgroud)

你会像这样使用它:

configuration.AddAuxiliaryDatabaseObject(CreateHighLowScript(
    modelInspector, Assembly.GetExecutingAssembly().GetExportedTypes()));
Run Code Online (Sandbox Code Playgroud)