好的,我已经完成了我能想到的事情。在过去的两天里,我一直都是搜索引擎的选择,并且尚未找到解决方案。
更新::我甚至已经将这些课程弄平,如下所示。
这是我拥有的......
注意::由于数据的敏感性,类名和属性名称发生了变化!
我有一个名为" 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。没有属性,没有值,没有。但是,返回的行数是完全相同的,就像我在数据库中运行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。
最后几个结束的想法......
HELP !!我完全被这种回归搞糊涂了,找不到任何错误。
答案 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值!