Search code examples
nhibernatenhibernate-mappingfluent-nhibernate-mappingnhibernate-mapping-by-code

order columns by name when using SchemaExport


i have a legacy db structure like

table t1
(
  c0 bigint, // pk
  c10 bigint,  // deleted flag
)

table t2
(
  c0 bigint, // pk
  c1 bigint, // fk to t1.c0
  c10 bigint,  // deleted flag
)

and classes

class Entity
{
    public virtual long Id { get; private set; }
    public virtual long Property { get; set; }
}

class Parent : Entity
{
    public virtual ICollection<Child> Childs { get; private set; }
}

class Child : Entity { }

After mapping it with MappingByCode or FNH, SchemaExport will create the columns in the wrong order.

table t2
(
  c0 bigint, // pk
  c10 bool,  // deleted flag
  c1 bigint, // fk to t1.c0
)

How can i make sure the columns are created in ascending order?


Solution

  • after digging through the source code i came up with this

    configuration.BeforeBindMapping += (sender, e) =>
    {
        // change to foreach if more than one classmapping per file
        var c = e.Mapping.RootClasses[0];
        c.Items = 
            // sort everything with a column (simple property, reference, ...)
            c.Items.OfType<IColumnsMapping>().OrderBy(cm => cm.Columns.First().name)
            // concat everything that has no column (collection, formula, ...)
            .Concat(c.Items.Where(o => !(o is IColumnsMapping))).ToArray();
    };