代码之家  ›  专栏  ›  技术社区  ›  David Neale

Fluent NHibernate-将实体映射为不同的类型

  •  1
  • David Neale  · 技术社区  · 14 年前

    我有一个类,我希望它作为一个组件映射到包含它的任何表中:

    public class Time
    {
        public int Hours { get; set; }
        public int Minutes { get; set; }
        public int Seconds { get; set; }
    }
    

    我想把这个班作为 bigint 在数据库中-与 TimeSpan 是存储的,但我的类具有完全不同的行为,所以我决定创建自己的类。

    我正在使用flh的automapper并将这个类设置为组件(其他类 Time 作为财产)。我已经创建了一个覆盖,但不确定如何映射它:

    我试了一下:

    public class TimeMappingOverride : IAutoMappingOverride<Time>
    {
        public void Override(AutoMapping<Time> mapping)
        {
            mapping.Map(x => x.ToTimeSpan());
            mapping.IgnoreProperty(x => x.Hours);
            mapping.IgnoreProperty(x => x.Minutes);
            mapping.IgnoreProperty(x => x.Seconds);
        }
    }
    

    但出现了这个错误:

    无法将“System.Linq.Expressions.UnaryExpression”类型的对象强制转换为“System.Linq.Expressions.MethodCallExpression”类型。

    我该怎么办?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jay    14 年前

    有关组件的详细信息,请参见: http://wiki.fluentnhibernate.org/Fluent_mapping#Components

    但首先,你不能映射一个方法。

    假设你改变 ToTimeSpan() 对财产 AsTimeSpan ,有两种方法可以做到这一点,只有更困难的方法才能为您工作,因为您正在使用自动应用:

    1. 创建一个 ComponentMap<Time> --一旦完成,现有的映射就可以工作了。这与自动应用不兼容。
    2. 以内联方式声明组件映射:
    mapping.Component(x => x.AsTimeSpan, component => {  
        component.Map(Hours);  
        component.Map(Minutes);  
        component.Map(Seconds);  
        });
    

    不过,你每次都得这么做。

    当然,这个地址不是“我想把这个类存储为 bigint 艾尔“

    你是说你只想坚持几秒钟?如果是这样的话,在顶部划掉所有东西,你有两个选择:

    1. 执行nhibernate IUserType (UH)
    2. 创建一个只将值存储为秒的私有属性或字段,并将其连接到nhibernate。pubic属性的getter和setter必须转换为/从秒开始。
        2
  •  0
  •   Alexander Groß    14 年前

    我个人还没有与汽车应用公司合作过,但我的建议是研究NHibernate的 IUserType 更改类型的持久化方式。我认为这是定义自定义映射 Time <-> bigint .

    读上面的代码, Map(x => x.ToTimeSpan()) 无法工作,因为无法将应用程序到数据库的转换代码嵌入到映射中。即使可能,声明也会错过从数据库到应用程序的转换。一 iuleType 另一方面,可以在 NullSafeGet NullSafeSet 方法。

    推荐文章