流利的Nhibernate ClassMaps和列顺序

Roc*_*o72 4 nhibernate fluent fluent-nhibernate

我们的实体拥有一组共同的属性.为了减少重复映射,我创建了一个映射标识和公共属性的基类ClassMap.对于每个实体的ClassMap,我只是对基类进行子类化,它运行良好.对于一个新项目,我们也让NH为我们生成数据库架构.问题是,列的顺序是这样的,即基本ClassMap中的属性首先出现,然后是子类中映射的任何内容.此构建的要求是列按特定顺序显示.

为了解决这个问题,我做了以下几点.

public class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected virtual void MapEntity()
    {
    }
}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        base.MapEntity();
    }

    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉就像一个黑客.除了黑客因素,这里有什么可能有问题吗?

dot*_*joe 5

如果你创建了基类和map方法的抽象,那就会觉得不那么hacky ......

public abstract class BaseMap<T> : ClassMap<T> where T : Entity
{
    public BaseMap()
    {
        Id(x => x.Id);
        MapEntity();
        Map(x => x.CommonProperty1);
        Map(x => x.CommonProperty2);
        Map(x => x.CommonProperty3);
    }

    protected abstract void MapEntity();

}

public class SomeEntityMap : BaseMap<SomeEntity>
{
    protected override void MapEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}
Run Code Online (Sandbox Code Playgroud)

这会将公共属性列保留在表的末尾.请注意,之后仍会添加外键列.除非您手动修改创建模式脚本,否则我认为没有任何方法可以完全控制列顺序w/fluent.