在Fluent NHibernate中自动映射属性

时间:2011-06-01 03:15:13

标签: fluent-nhibernate

我正在使用复杂的遗留模式并将其映射到Fluent NHibernate。架构很古怪,我已经放弃了自动化;表格之间的关系是奇怪和复杂的,它将涉及大量的例外。

事实是,简单的属性是完全正常的;表的Title列映射到该实体的Title属性,依此类推。但是因为我选择退出全局自动化,似乎没有办法避免在每个类上映射我的每个字符串和整数属性。我发现自己想要像

这样的东西
class SomeMapping : ClassMap<SomeEntity>
{
    public SomeMapping()
    {
        MapEverythingSimple();
    }
}

在我构建一些复杂的东西,反射性地发出lambda表达式(或某些东西)之前,我是否只是缺少一个明显的特征?

4 个答案:

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

然后让地图类继承自那个。显然,它有一些严重的缺陷,我没有采用它。