我们的实体拥有一组共同的属性。为了减少重复映射,我创建了一个映射标识和公共属性的基类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);
}
}
这很有效,但感觉就像是黑客。除了黑客因素之外,这里有什么可能有问题吗?
答案 0 :(得分:5)
如果你创建了基类和map方法,那么它就会觉得不那么笨拙......
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);
}
}
这会将公共属性列保留在表的末尾。请注意,在这些列之后仍会添加外键列。除非您手动修改创建模式脚本,否则我认为没有任何方法可以完全控制列顺序w / fluent。
答案 1 :(得分: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);
}
}
最终结果相同,但您没有使用重写方法来添加映射。它会自动处理。