2009-04-06 8 views
1

子オブジェクトのコレクションでオブジェクトを永続化しようとしています。私はFKの関係があるので、最初に子供たちを永続させることはできません。私は最初に親を救ってからそれを追加することができますが、これはもっと多くの仕事をもたらすでしょう。基本的には、1つのステップで完全に入力されたオブジェクトを保存し、それを分割しないようにしようとしています。私のマッピングに何か問題がありますか(それはとても醜いと申し訳ありません)、それとも私の方法ですか?NHibernate:子でオブジェクトを持続する

親:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="NetworkOrderManagement.Core.Order, NetworkOrderManagement.Core" table="NETORDMGMT.ORDERHEADER" lazy="false" > 
    <id name="OrderId" column="ORDERID" type="int"> 
     <generator class="seqhilo"> 
     <param name="sequence">ORDERID_SEQ</param> 
     </generator> 
    </id> 
    <property name="TransmissionDate" column="TRANSMISSIONDATE" type="DateTime"/> 
    <property name="StoreNumber" column="STORENUMBER" type="Int16"/> 
    <property name="Department" column="DEPARTMENT" type="Int16"/> 
    <property name="OrderType" column="ORDERTYPE" type="Int16"/> 
    <property name="OrderSequence" column="ORDERSEQUENCE" type="Int16"/> 
    <property name="ExtractTime" column="EXTRACTTIME" type="DateTime"/> 
    <property name="Status" column="STATUS" type="Int16"/> 
    <property name="ReceivedTime" column="RECEIVEDTIME" type="DateTime"/> 
    <bag name="OrderDetail" table="NETORDMGMT.ORDERDETAIL" 
     lazy="false" cascade="all" inverse="true"> 
     <key column="ORDERID" on-delete="cascade"/> 
     <one-to-many class="NetworkOrderManagement.Core.OrderDetail, NetworkOrderManagement.Core" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

子供:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="NetworkOrderManagement.Core.OrderDetail, NetworkOrderManagement.Core" table="NETORDMGMT.ORDERDETAIL" lazy="false"> 
    <id name="OrderDetailId" column="ORDERDETAILID" type="int"> 
     <generator class="seqhilo"> 
     <param name="sequence">"ORDERDTLID_SEQ"</param> 
     </generator> 
    </id> 
<many-to-one name="Order" class="NetworkOrderManagement.Core.Order, NetworkOrderManagement.Core" 
       column="OrderId" lazy="false" not-null="true" /> 
    <property name="ItemNumber" column="ITEMNUMBER" type="Int32"/> 
    <property name="OrderQuantity" column="ORDERQUANTITY" type="Int32"/> 
    <property name="ErrorCode" column="ERRORCODE" type="Int32"/> 
    </class> 
</hibernate-mapping> 

は、ここに私の例外です:

Test method NetworkOrderManagement.Tests.DataAccess.QuickTests.QuickTest threw exception: 
Distribution.Exceptions.DataAccessException: NHibernate Exception ---> 
NHibernate.PropertyValueException: not-null property references a null or transient valueNetworkOrderManagement.Core.OrderDetail.Order. 

以下の私のテストは、それながら順番にorderdetailを追加しようとしたとき、私はこれを取得しますまだ一時的です:

[TestMethod] 
    public void QuickTest() 
    { 
     myOrderRepository = NetworkOrderManagement.Data.RepositoryFactory.Instance.GetOrderRepository(); 
     myOrderDetailRepository = NetworkOrderManagement.Data.RepositoryFactory.Instance.GetOrderDetailRepository(); 
     myOrder = new Order { StoreNumber = RandGen.LittleRand(), Department = RandGen.LittleRand(), TransmissionDate = DateTime.MinValue, ExtractTime = DateTime.MinValue, ReceivedTime = DateTime.MinValue }; 
     myOrder = myOrderRepository.Save(myOrder); 

     myOrderDetail1 = new OrderDetail {OrderId = myOrder.OrderId, ItemNumber = RandGen.BigRand(), OrderQuantity = RandGen.LittleRand() }; 
     myOrderDetail2 = new OrderDetail {OrderId = myOrder.OrderId, ItemNumber = RandGen.BigRand(), OrderQuantity = RandGen.LittleRand() }; 
     myOrderDetail1 = myOrderDetailRepository.Save(myOrderDetail1); 
     myOrderDetail2 = myOrderDetailRepository.Save(myOrderDetail2); 
     myOrder.OrderDetail.Add(myOrderDetail1); 
     myOrder.OrderDetail.Add(myOrderDetail2); 

     myOrderRepository.CommitChanges(); 

     myOrderDetailRepository.Delete(myOrderDetail2); 
     myOrderRepository.CommitChanges(); 
     myOrderRepository.Delete(myOrder); 
     myOrderRepository.CommitChanges(); 
    } 

答えて

6

は、コレクションにカスケード指定し、さて、私はあなたがそれをやったことを見てきましたNHibernateのはあなた

http://ayende.com/Blog/archive/2006/12/02/NHibernateCascadesTheDifferentBetweenAllAlldeleteorphansAndSaveupdate.aspx

http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/example-parentchild.html

のためにそれを把握しましょう。 :) あなたが行っていないことは、バックリファレンスを指定することです。 私は意味:あなたは、あなたのコレクションに項目を追加するが、この追加項目は設定していない、その所有者への財産ました:

Order o = new Order(); 

OrderDetail detail = new OrderDetail(); 

detail.Order = o; 
o.OrderLines.Add (detail); 

をしても良いだろう何(私見)は、この(簡体字)であります:

public class Order 
{ 
    private IList<OrderDetail> _details = new List<OrderDetail>(); 

    public ReadOnlyCollection<OrderDetail> Details 
    { 
     return new List(_details).AsReadOnly(); 
    } 

    public void AddOrderLine(OrderDetail d) 
    { 
     d.Order = this; 
     _details.Add (d); 
    } 

    public void RemoveOrderLine(OrderDetail d) 
    { 
     _details.Remove (d); 
    } 
} 
+0

うまく働いていただき、ありがとうございます。 –

関連する問題