Please,
That someone can give me a light, I am testing the NH, but I am not able to make this relationship.
I'm using SQL Server database sample AdventureWorksLT, and my classes and mapping files are below.
I tried several configurations with <bag> <list> ... but anything works!
The error when I run the Load in SalesOrder is:
NHibernate.Exceptions.GenericADOException was caught
Message="could not initialize a collection: [NHibernate3.Model.SalesOrder.Details#71782][SQL: SELECT details0_.SalesOrderId as SalesOrd1_1_, details0_.SalesOrderDetailID as SalesOrd2_1_, details0_.SalesOrderID as SalesOrd1_1_0_, details0_.SalesOrderDetailID as SalesOrd2_1_0_ FROM SalesLT.SalesOrderDetail details0_ WHERE details0_.SalesOrderId=?]"
Source="NHibernate"
StackTrace:
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id, ISessionImplementor session)
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session)
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event)
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing)
at NHibernate.Collection.AbstractPersistentCollection.ForceInitialization()
at NHibernate.Engine.StatefulPersistenceContext.InitializeNonLazyCollections()
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
at NHibernate.Impl.CriteriaImpl.List(IList results)
at NHibernate.Impl.CriteriaImpl.List[T]()
at NHibernate3.Model.SalesOrder.Load(Int32 salesOrderId) in C:\Documents and Settings\emmanuel\Meus documentos\Visual Studio 2008\Projects\NHibernate3\NHibernate3.Model\SalesOrder.cs:line 44
InnerException: System.InvalidCastException
Message="Specified cast is not valid."
Source="NHibernate3.Model"
StackTrace:
at (Object , Object[] , SetterCallback )
at NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values)
at NHibernate.Tuple.Component.PocoComponentTuplizer.SetPropertyValues(Object component, Object[] values)
at NHibernate.Type.ComponentType.SetPropertyValues(Object component, Object[] values, EntityMode entityMode)
at NHibernate.Type.ComponentType.ResolveIdentifier(Object value, ISessionImplementor session, Object owner)
at NHibernate.Type.ComponentType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
at NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, ILoadable persister, Object id, IDataReader rs, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type)
InnerException:
Files:
public class SalesOrder {
public virtual int SalesOrderId { get; set; }
public virtual IList Details { get; set; }
public virtual IList<SalesOrder> Load(int salesOrderId) {
var session = NHibernateHelper.OpenSession();
var criteria = session.CreateCriteria(typeof(SalesOrder));
criteria.Add(NHibernate.Criterion.Expression.Eq("SalesOrderId", salesOrderId));
IList<SalesOrder> salesOrders = null;
try {
salesOrders = criteria.List<SalesOrder>();
}
catch(Exception e) {
//session.Transaction.Rollback();
}
finally {
session.Close();
}
return salesOrders;
}
}
public class SalesOrderDetail {
public virtual int SalesOrderId { get; set; }
public virtual int SalesOrderDetailId { get; set; }
public override int GetHashCode() {
int result = this.SalesOrderId.GetHashCode();
result += this.SalesOrderDetailId.GetHashCode();
return result;
}
public override bool Equals(object obj) {
if(obj == null)
return false;
SalesOrderDetail soDetail = (SalesOrderDetail)obj;
return soDetail.SalesOrderId.Equals(this.SalesOrderId) && soDetail.SalesOrderDetailId.Equals(this.SalesOrderDetailId);
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate3.Model" assembly="NHibernate3.Model">
<class name="NHibernate3.Model.SalesOrder" table="SalesLT.SalesOrderHeader">
<id name="SalesOrderId" column="SalesOrderID" type="Int32" >
<generator class="identity" />
</id>
<bag name="Details" inverse="true" lazy="false" cascade="all">
<key>
<column name="SalesOrderId" />
</key>
<one-to-many class="NHibernate3.Model.SalesOrderDetail" />
</bag>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate3.Model" assembly="NHibernate3.Model">
<class name="NHibernate3.Model.SalesOrderDetail" table="SalesLT.SalesOrderDetail" lazy="false">
<composite-id>
<key-many-to-one name="SalesOrderId" column="SalesOrderID" class ="NHibernate3.Model.SalesOrder" />
<key-property name="SalesOrderDetailId" column="SalesOrderDetailID" type ="Int32" />
</composite-id>
</class>
</hibernate-mapping>
|