Fluent NHibernate返回IList <t>的NULL记录</t>

时间:2014-07-11 11:53:01

标签: c# nhibernate fluent-nhibernate fluent icriteria

好的,我已经完成了我能想到的事情。在过去的两天里,我一直都是搜索引擎的选择,并且尚未找到解决方案。

更新::我甚至已经将这些课程弄平,如下所示。

这是我拥有的......

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

我有一个名为&#34; MyData&#34;的实体对象。它看起来像这样......

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。没有属性,没有值,没有。但是,返回的行数是完全相同的,就像我在数据库中运行select一样。这是我用来从应用程序中选择数据的代码。请记住,这个完全相同的代码适用于其他对象,因为我们实际上正在重用此方法!

        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>();

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

最后几个结束的想法......

  1. 代码库中的其他对象使用相同的ICriteria对象并返回数据。
  2. 此对象的NHibernate映射与Fluent映射相同。
  3. 包含此代码的此应用程序运行良好,特别是对于数量的 消费和创造数据。
  4. Oracle中的此数据库表没有PK。 (我没有设计它,我只是继承了它!)
  5. HELP !!我完全被这种回归搞糊涂了,找不到任何错误。

1 个答案:

答案 0 :(得分:2)

终于在认为自己做错了3天之后想出来了。

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

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

简而言之,如果您正在为映射对象创建compositeId,请确保所有数据都存在且没有NULL值!