NHibernate 1对多的问题

ranmer 2012-02-10 10:23:43

子实体,使用了复合主键,我在网上找了很多方法,还是没解决,以下是代码和异常:

order的实体和映射
namespace NhTest.Model
{
[Serializable]
public class Order
{

public virtual int ID { get; set; }

public virtual String CustomerName { get; set; }

public virtual decimal TotalAmt { get; set; }

public virtual DateTime Created { get; set; }

public virtual String Status { get; set; }

public virtual IList<OrderDetail> Items { get; set; }
}
}



<?xml version="1.0" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NhTest"
namespace="NhTest.Model">

<class name="Order" table="[Order]">
<id name="ID">
<generator class="native" />
</id>

<property name="Created" />
<property name="CustomerName"/>
<property name="TotalAmt" column="Amt"/>
<property name="Status"/>

<bag name="Items" table="OrderDetail" generic="true" inverse="true" cascade="all">
<key column="OrderID" foreign-key="FK_OrderDetail"></key>
<one-to-many class="OrderDetail"/>
</bag>

</class>
</hibernate-mapping>



orderdetail 的实体和映射
 public class OrderDetailPK
{

public virtual int OrderID { get; set; }

public virtual int RowNumber { get; set; }


public override bool Equals(object obj)
{
if (obj is OrderDetailPK)
{
var second = obj as OrderDetailPK;
if (this.OrderID == second.OrderID
&& this.RowNumber == second.RowNumber)
{
return true;
}
else return false;
}
return false;
}

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

[Serializable]
public class OrderDetail
{
public virtual OrderDetailPK PK { get; set; }

public virtual int PKComposite_Orderid { get; set; }

public virtual int PKComposite_RowNumber { get; set; }

public virtual String ProductName { get; set; }

public virtual int Qty { get; set; }

public virtual decimal Price { get; set; }

public virtual Order Order { get; set; }

}


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NhTest"
namespace="NhTest.Model">

<class name="OrderDetail">

<composite-id name="PK" class="OrderDetailPK">
<key-many-to-one name="OrderID" column="OrderID" class="Order"/>
<!--<key-property name="OrderID" column="OrderID"></key-property>-->
<key-property name="RowNumber" column="RowNumber"/>
</composite-id>


<property name="PKComposite_Orderid" not-null="true" formula="OrderID" />
<property name="PKComposite_RowNumber" not-null="true" formula="RowNumber" />

<property name="ProductName"/>
<property name="Price"/>
<property name="Qty"/>

<many-to-one name="Order" column="OrderID" class="Order" not-null="true" foreign-key="FK_OrderDetail">
</many-to-one>

</class>
</hibernate-mapping>



调用方法

Order ord = new Order();
//ord.ID = 10;
ord.CustomerName = "张三";
ord.Created = DateTime.Now;
ord.Status = "ok";
ord.TotalAmt = 100;
ord.Items = new List<OrderDetail>();

ord.Items.Add(new OrderDetail()
{
PK=new OrderDetailPK(){
OrderID=9,
RowNumber=1,
},
PKComposite_Orderid=9,
PKComposite_RowNumber=1,
Price=34,
Qty=23,
ProductName="王老吉",
Order=ord
});

//session.save(ord);
...全文
89 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
奔跑前行 2012-02-12
  • 打赏
  • 举报
回复
你 public class OrderDetailPK 这个多主键 的映射要继承一个接口吧 我贴我的给你看看哈。。。。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nhibernator
{
public class SmeltPoId : IEquatable<SmeltPoId>
{

private int? _requestedHashCode;

public string Id { get; set; }
public int Type { get; set; }

public bool Equals(SmeltPoId other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return Equals(other.Id, Id) && other.Id == Id;
}

public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != typeof(SmeltPoId))
{
return false;
}
return Equals((SmeltPoId)obj);
}

public override int GetHashCode()
{
if (!_requestedHashCode.HasValue)
{
_requestedHashCode = Id.GetHashCode();

}
return _requestedHashCode.Value;
}

}
}
---------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Nhibernator.SmeltPo, Nhibernator" table="Smelt" lazy="false">
<composite-id name="Id" class="Nhibernator.SmeltPoId,Nhibernator">
<key-property name="Id" column="Id" type="String" />
<key-property name="Type" column="Type" type="System.Int32"/>
</composite-id>
<property name="StuLev" type="System.Int32" />
<property name="MinCount" type="System.Int32" />
<property name="MaxCount" type="System.Int32" />
<property name="TimeUsed" type="System.Int32" />
<property name="EnergyConsume" type="System.Int32"/>

</class>
</hibernate-mapping>
----------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Nhibernator
{
public class SmeltPo
{
public SmeltPo()
{ }


public SmeltPoId Id
{
set;
get;
}


public int MinCount
{
set;
get;
}

public int StuLev
{
set;
get;
}



public int TimeUsed
{
set;
get;
}


public int MaxCount
{
set;
get ;
}


public int EnergyConsume
{
get;
set;
}
}
}

具体自己 去对照 查原因咯。。。。呵呵
ranmer 2012-02-12
  • 打赏
  • 举报
回复
没人理我,自己顶下
ranmer 2012-02-10
  • 打赏
  • 举报
回复
调用save时出现异常:
System.IndexOutOfRangeException was unhandled
Message=Invalid index 5 for this SqlParameterCollection with Count=5.
Source=System.Data
StackTrace:
at System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32 index)
at System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32 index)
at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
at NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\Int32Type.cs:line 60
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs:line 182
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs:line 140
at NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ComponentType.cs:line 222
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2422
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2671
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 3053
at NHibernate.Action.EntityInsertAction.Execute() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Action\EntityInsertAction.cs:line 61
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 136
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 125
at NHibernate.Engine.ActionQueue.ExecuteActions() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Engine\ActionQueue.cs:line 170
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 241
at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:line 20
at NHibernate.Impl.SessionImpl.Flush() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1487
at NhTest.Utils.RepositoryBase`1.Add(TEntity model) in E:\My Studio\MyProjects\Jianworks\tests\NhTest\Utils\RepositoryBase.cs:line 50
at NhTest.Program.Main(String[] args) in E:\My Studio\MyProjects\Jianworks\tests\NhTest\Program.cs:line 39
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:



调用get时出现异常:

NHibernate.Exceptions.GenericADOException was unhandled
Message=could not initialize a collection: [NhTest.Model.Order.Items#2][SQL: SELECT items0_.OrderID as OrderID1_, items0_.RowNumber as RowNumber1_, items0_.OrderID as OrderID0_0_, items0_.RowNumber as RowNumber0_0_, items0_.ProductName as ProductN3_0_0_, items0_.Price as Price0_0_, items0_.Qty as Qty0_0_, items0_.OrderID as formula0_0_, items0_.RowNumber as formula1_0_ FROM OrderDetail items0_ WHERE items0_.OrderID=?]
Source=NHibernate
SqlString=SELECT items0_.OrderID as OrderID1_, items0_.RowNumber as RowNumber1_, items0_.OrderID as OrderID0_0_, items0_.RowNumber as RowNumber0_0_, items0_.ProductName as ProductN3_0_0_, items0_.Price as Price0_0_, items0_.Qty as Qty0_0_, items0_.OrderID as formula0_0_, items0_.RowNumber as formula1_0_ FROM OrderDetail items0_ WHERE items0_.OrderID=?
StackTrace:
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1411
at NHibernate.Loader.Collection.CollectionLoader.Initialize(Object id, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Collection\CollectionLoader.cs:line 40
at NHibernate.Persister.Collection.AbstractCollectionPersister.Initialize(Object key, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Collection\AbstractCollectionPersister.cs:line 580
at NHibernate.Event.Default.DefaultInitializeCollectionEventListener.OnInitializeCollection(InitializeCollectionEvent event) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Event\Default\DefaultInitializeCollectionEventListener.cs:line 52
at NHibernate.Impl.SessionImpl.InitializeCollection(IPersistentCollection collection, Boolean writing) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 1605
at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 468
at NHibernate.Collection.AbstractPersistentCollection.Read() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 265
at NHibernate.Collection.AbstractPersistentCollection.ReadSize() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection\AbstractPersistentCollection.cs:line 293
at NHibernate.Collection.PersistentBag.get_Count() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Collection\PersistentBag.cs:line 408
at NhTest.Program.Main(String[] args) in E:\My Studio\MyProjects\Jianworks\tests\NhTest\Program.cs:line 43
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidCastException
Message=Specified cast is not valid.
Source=NhTest
StackTrace:
at (Object , Object[] , SetterCallback )
at NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues(Object target, Object[] values) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Bytecode\Lightweight\AccessOptimizer.cs:line 33
at NHibernate.Tuple.Component.PocoComponentTuplizer.SetPropertyValues(Object component, Object[] values) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Tuple\Component\PocoComponentTuplizer.cs:line 80
at NHibernate.Type.ComponentType.SetPropertyValues(Object component, Object[] values, EntityMode entityMode) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ComponentType.cs:line 297
at NHibernate.Type.ComponentType.ResolveIdentifier(Object value, ISessionImplementor session, Object owner) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ComponentType.cs:line 524
at NHibernate.Type.ComponentType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\ComponentType.cs:line 205
at NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, IEntityPersister persister, Object id, IDataReader rs, ISessionImplementor session) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 790
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 327
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 482
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 246
at NHibernate.Loader.Loader.LoadCollection(ISessionImplementor session, Object id, IType type) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 1393
InnerException:

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧