【问题标题】:Fluent NHibernate returns an IList<T> of NULL recordsFluent NHibernate 返回一个 IList<T> 的 NULL 记录
【发布时间】:2014-09-02 00:57:50
【问题描述】:

好的,我已经完成了我能想到的所有事情。在过去的两天里,我一直在选择搜索引擎,但还没有找到解决方案。

更新:: 我什至已经将类扁平化,如下所示。

这就是我所拥有的......

注意:: 由于数据的敏感性,类名和属性名发生了变化!

我有一个名为“MyData”的实体对象。好像是这样的……

public class MyData
{
    public virtual int id { get; set;}
    public virtual int StepId { get; set;}
    public virtual Decimal ProjectedValue { get; set;}
    public virtual String Stage { get; set;}
    public virtual String CreatedBy { get; set;}
    public virtual DateTime CreatedDate { get; set;}
    public virtual int RunId { get; set;}
    public virtual Int32 DataKey { get; set;}
    public virtual DateTime ForecastDate { get; set;}
    public virtual String UnitMeasure { get; set;}
    public virtual String FixedFlag { get; set;}
    public virtual String DataSource { get; set;}
    public virtual String ResourceType { get; set;}
    public virtual String DataType { get; set;}     

              public override bool Equals(object obj)
    {
        //Not implemented
        return false;
    }

    public override int GetHashCode()
    {            
        return base.GetHashCode();
    }

    public MyData()
    {
    }
     }

这是用于地图的代码。

        Table("MYDATA");
        CompositeId()
            .KeyProperty(mtm => mtm.RunId, "RUN_ID")
            .KeyProperty(mtm => mtm.DataKey, "CC_KEY")
            .KeyProperty(mtm => mtm.ForecastDate, "FORECAST_DATE")
            .KeyProperty(mtm => mtm.UnitMeasure, "UOM")
            .KeyProperty(mtm => mtm.FixedFlag, "FIXED_FLAG")
            .KeyProperty(mtm => mtm.DataSource, "DATA_SOURCE")
            .KeyProperty(mtm => mtm.ResourceType, "RESOURCE_TYPE")
            .KeyProperty(mtm => mtm.DataType, "DATA_TYPE")
        Map(mtm => mtm.StepId, "STEP_ID").Not.LazyLoad();
        Map(mtm => mtm.ProjectedValue, "PROJECTED_VALUE");
        Map(mtm => mtm.Stage, "STAGE").Not.LazyLoad();
        Map(audit => audit.CreatedBy, "CREATED_BY").Not.Nullable();
        Map(audit => audit.CreatedDate, "CREATED_DATE");

这个类已经满足 NHibernate 和 Fluent 的映射要求。我们正在将 NHibernate 转换为 Fluent。

当我将这两个限制添加到 ICriteria 对象并调用该方法以取回数据时,我得到(在此特定示例中)超过 15000 条记录,但它们都是 NULL。没有属性,没有值,什么都没有。但是,返回的行数与我在数据库中运行选择完全相同。这是我用来从应用程序中选择数据的代码。请记住,这个完全相同的代码适用于其他对象,因为我们实际上是在重用这个方法!

        ICriteria c = _session.CreateCriteria(typeof(T));

        foreach (string searchField in searchCriteria.Keys)
        {
            c.Add(Restrictions.Eq(searchField, searchCriteria[searchField]));
        }

        IList<T> l = c.List<T>();

当我单步执行代码时,集合“l”有行,但它们都是 NULL 对象。但是,它们属于 Type。

一些最后的结束想法...

  1. 代码库中的其他对象使用相同的 ICriteria 对象并返回数据正常。
  2. 此对象的 NHibernate 映射完全匹配 Fluent 映射。
  3. 包含此代码的此应用程序运行良好,尤其是对于
    正在使用和创建的数据。
  4. Oracle 中的这个数据库表没有 PK。 (不是我设计的,我只是继承了它!)

帮助!!我完全被这个回报弄糊涂了,找不到任何问题。

【问题讨论】:

  • 这有帮助吗? itcodemonkey.blogspot.com/2009/06/…?如果您尝试使用 Get 加载现有实体,您会得到 null 吗?下一步是从 Fluent NHibernate 导出模式,以便您可以检查 XML 映射。顺便说一句,这必须是最复杂主键的记录。
  • 我同意。我做了一个更新,向你展示我是如何重构的。这是我正在继承的预先存在的代码。前三位开发人员中有两位是尝试过 C# 的 Java 开发人员! ....这是同样的问题,我在表(Oracle)中有一个“Run_ID”字段。奇怪的是,这个映射好的 NHibernate 版本。当我们使用 Fluent 时,就开始了这种愚蠢。

标签: c# nhibernate fluent-nhibernate fluent icriteria


【解决方案1】:

终于在考虑了 3 天后发现自己做错了什么。

基本上是 CompositeId 对象的映射存在问题。对上面列出的对象进行了编辑,试图一起删除 CompositeId 对象。 ID 不是一个简单的 INT,而是一个包含 8 个其他属性的对象。

好吧,指定 RunId 的 CC_KEY 列(DataKey 属性)在数据库中设置为 NULL。当我尝试查询对象并创建复合键时,空对象导致传入数据的每一行都失败。这阻止了 FluentNHibernate 创建 CompositeId 对象。 没有 ID,没有对象!这允许系统返回正确数量的结果,但是,当尝试使用 null CompositeKey.KeyColumn 值创建每个对象时,它失败了。

长话短说,如果您要为映射对象创建 CompositeId,请确保您的所有数据都存在并且没有 NULL 值!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多