4

我们的实体有一组共同的属性。为了减少重复映射,我创建了一个映射身份和公共属性的基本 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);        
    }
}

这行得通,但感觉就像一个黑客。除了黑客因素之外,这里还有什么可能有问题的吗?

4

2 回答 2

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);        
    }
}

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

于 2010-11-15T19:48:24.807 回答
3

我只需要自己实现类似的东西。

假设你有

public class SomeEntity : Entity
{ 
    ...
}

一种不那么“黑客”的方式是:

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

public class SomeEntityMap : BaseMap<SomeEntity>
{
    public SomeEntity()
    {
        Map(x => x.SomeEntityProperty1);
        Map(x => x.SomeEntityProperty2);
        Map(x => x.SomeEntityProperty3);        
    }
}

最终结果相同,但您没有使用重写的方法来添加映射。它会自动处理。

于 2010-09-30T05:18:33.433 回答