我正在使用复杂的遗留模式并将其映射到Fluent NHibernate。架构很古怪,我已经放弃了自动化;表格之间的关系是奇怪和复杂的,它将涉及大量的例外。
事实是,简单的属性是完全正常的;表的Title
列映射到该实体的Title
属性,依此类推。但是因为我选择退出全局自动化,似乎没有办法避免在每个类上映射我的每个字符串和整数属性。我发现自己想要像这样的东西
class SomeMapping : ClassMap<SomeEntity>
{
public SomeMapping()
{
MapEverythingSimple();
}
}
在我构建一些复杂的东西,反射性地发出lambda表达式(或某些东西)之前,我是否只是缺少一个明显的特征?
答案 0 :(得分:1)
如果使用自动化,然后覆盖不符合约定的内容,那该怎么办? 我认为这不是太多的负担。您需要指定复杂的关系 无论如何,这不符合某个惯例。
答案 1 :(得分:0)
或者您可以尝试使用NHibernate Mapping Generator从现有数据库表生成NHibernate映射文件和相应的域类: http://nmg.codeplex.com/
答案 2 :(得分:0)
使用Visual NHibernate的试用版快速生成实体类和Fluent映射,然后从那里获取它。 免责声明:我为Slyce Software工作。
答案 3 :(得分:0)
这是不我最终做的事情,但对于后人,这里是如何在不使用自动播放器的情况下自动映射属性:
public class PropMap<V> : ClassMap<V>
{
public PropMap()
{
foreach (var propInfo in typeof(V).GetProperties()
.Where(p => simpleTypes.Contains(p.PropertyType)))
{
ParameterExpression param = Expression.Parameter(typeof(V), "x");
Map(Expression.Lambda<Func<V, object>>(
Expression.Convert(Expression.MakeMemberAccess(param, propInfo), typeof(object)), param));
}
}
private static readonly Type[] simpleTypes = new[]
{
typeof (DateTime),
typeof (String),
typeof (int),
typeof (long),
typeof (Enum)
};
}
然后让地图类继承自那个。显然,它有一些严重的缺陷,我没有采用它。