在fluent nhibernate中映射一列两次

在fluent nhibernate中映射一列两次,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我们走吧。。。 我有一个表(很遗憾,我无法更改),其中的列如下: 日期 开始时间 结束时间 我有两个字段的数据类: startDateTime=日期+开始时间 endDateTime=日期+结束时间 Map(x => x.EndDateTime) .Columns.Clear() .Columns.Add("date", "endTime") .CustomType<MyCustomType&

我们走吧。。。 我有一个表(很遗憾,我无法更改),其中的列如下:

  • 日期
  • 开始时间
  • 结束时间
我有两个字段的数据类: startDateTime=日期+开始时间 endDateTime=日期+结束时间

        Map(x => x.EndDateTime)
            .Columns.Clear()
            .Columns.Add("date", "endTime")
            .CustomType<MyCustomType>();

        Map(x => x.StartDateTime)
            .Columns.Clear()
            .Columns.Add("date", "startTime")
            .CustomType<MyCustomType>();
Map(x=>x.EndDateTime)
.Columns.Clear()
.列。添加(“日期”、“结束时间”)
.CustomType();
映射(x=>x.StartDateTime)
.Columns.Clear()
.列。添加(“日期”、“开始时间”)
.CustomType();
MyCustomType是一个实现IUserType接口的类。这似乎是可行的,但它只适用于从数据库读取数据。在保存或更新NHibernate时,将列“date”放置两次,并且无法提交查询


我的问题是:有没有办法解决这个问题?我希望这两个字段都不是只读的。(将其中一个设置为只读有帮助,但这不是一个让我满意的解决方案)。

好的,我找到了一个解决方案。。。它不是很优雅,但是这个数据库也不优雅:)

因此,在我的BaseController中,它处理所有的事情,比如添加、保存、删除和更新,我对保存这种特定类型做了一些特殊处理:

    public virtual T Save<T>(T entity)
    {
        try
        {
            if (entity.GetType().Equals(typeof(SpecialType)))
            {
                return SaveSpecialType<T>(entity);
            }
            ITransaction transaction = session.BeginTransaction();           
            session.Save(entity);
            transaction.Commit();
            return entity;
        }
        catch (Exception ex)
        {
            if (logError.IsErrorEnabled)
                logError.Error(ex.Message + " \n " + ex.InnerException, ex);
            throw;
        }
    }
公共虚拟T存储(T实体)
{
尝试
{
if(entity.GetType().Equals(typeof(SpecialType)))
{
返回SaveSpecialType(实体);
}
ITransaction事务=session.BeginTransaction();
session.Save(实体);
Commit();
返回实体;
}
捕获(例外情况除外)
{
if(logError.iserror已启用)
logError.Error(ex.Message+“\n”+ex.InnerException,ex);
投掷;
}
}

此SaveSpecialType方法执行本机sql查询,将该混乱类型插入数据库中。如果两个不同的属性具有不同的值,即使它们应该指向同一个基础表字段,您会得到什么样的错误?您希望怎么做?

我得到的错误是:参数索引超出范围。那么,关于你的第二个问题。在数据库中,我有三个字段:日期(仅日期,作为字符串yyyyMMdd)、开始时间(作为字符串HHmm)和结束时间(字符串HHmm)。在数据类中,我有两个DateTime类型的字段。所以StartDateTime=date+startTime EndDateTme=date+endTime这两个字段的问题很常见。我希望我说得很清楚:)与其在数据对象中有两个“不相关”的字段,不如使用一个具有属性Start/End的对象(即Period)。我认为您可以通过ICompositeUserType转换器将一个属性映射到数据库中的3列。这肯定会起作用,谢谢您的帮助。不幸的是,我不能改变任何事情。既不是数据库,也不是数据类。我们正在尝试从旧数据库(充满数据)移植到新的数据类(已经在一些客户端中使用,并且使用新的数据库)。所以一切都应该保持原样……:)好的,那么如果您有两个独立的IUSERTYPE,并使用StartDateTime定义日期和startTime字段值,而使用EndDateTime仅定义endTime字段值,该怎么办。您可能还需要实现IParameterizedType并配置每个属性以了解其他属性(例如,EndDateTime需要查看属性值日期部分的StartDateTime)。我相信这还没有完全考虑清楚,但它可能会让你开始。我想这是解决这个问题的最好办法。。。谢谢你的帮助!