2012-09-22 4 views
0

데이터베이스에 다 대일 관계가있는 상위를 저장하려고하면 하위가 올바른 아버지의 ID로 업데이트되지 않습니다. 저장시 외래 키가 null입니다.

nhibernate many-to-one parent is always null on insert

NHibernate one-to-many foreign key is NULL

는 그 클래스 내 "아버지"매핑 다음에 : 그들은 나를 위해 작동하지 않았더라도

나는 비슷한 여기에이 질문을 발견

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping assembly="FrancosPoS" namespace="FrancosPoS.DBMapping" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="order" table="`order`" lazy="true" > 
    <id name="idOrder"> 
     <generator class="identity" /> 
    </id> 
    <property name="price"> 
     <column name="price" sql-type="decimal(8,4)" not-null="true" /> 
    </property> 
    <property name="cash"> 
     <column name="cash" sql-type="tinyint(1)" not-null="false" /> 
    </property> 
    <property name="credit"> 
     <column name="credit" sql-type="tinyint(1)" not-null="false" /> 
    </property> 
    <property name="obs"> 
     <column name="obs" sql-type="varchar(350)" not-null="false" /> 
    </property> 
    <bag name="orderPsi" table="ordPsi" cascade="all" inverse="true"> 
     <key column="idOrdPastaI"/> 
     <one-to-many class="ordPsi"/> 
    </bag> 
    </class> 
</hibernate-mapping> 

클래스 :

namespace FrancosPoS.DBMapping 
{  
    public partial class order 
    { 
     public order() { } 
     public virtual int idOrder { get; set; } 
     public virtual string price { get; set; } 
     public virtual System.Nullable<int> cash { get; set; } 
     public virtual System.Nullable<int> credit { get; set; } 
     public virtual string obs { get; set; } 
     public virtual IList<ordPsi> orderPsi { get; set; } 
    } 
} 

그럼, 같은 순서를 참조 많은 orderPsi을 가질 수

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping assembly="FrancosPoS" namespace="FrancosPoS.DBMapping" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="ordPsi" table="ord_psi" lazy="true" > 
    <id name="idOrdPastaI"> 
     <generator class="identity" /> 
    </id> 
    <many-to-one insert="false" update="false" lazy="false" name="order" class="order"> 
     <column name="idOrder" sql-type="int(11)" not-null="false" /> 
    </many-to-one> 
    <property name="obs"> 
     <column name="obs" sql-type="varchar(50)" not-null="false" /> 
    </property> 
    <property name="price"> 
     <column name="price" sql-type="decimal(8,4)" not-null="true" /> 
    </property> 
    </class> 
</hibernate-mapping> 

등급 :

public partial class ordPsi 
{ 
    public ordPsi() { } 
    public virtual int idOrdPastaI { get; set; } 
    public virtual order order { get; set; } 
    public virtual string obs { get; set; } 
    public virtual string price { get; set; } 
} 

마지막으로, 저장을위한 다음과

order order = new order(); 
ordPsi orderPsi = new ordPsi(); 

order.price = "321"; 
order.cash = 1; 
order.credit = 0; 

orderPsi.order = order; 
orderPsi.price = "20.00"; 
order.orderPsi = new List<ordPsi>(); 
order.orderPsi.Add(orderPsi); //add the child to the father 
orderDB.setOrder(order); 

을 데이터베이스 방법 :

public string setOrder(order order) 
{ 
    try 
    { 
     databaseConnection conn = new databaseConnection(); 
     conn.OpenConnection(); 

     conn.Session.SaveOrUpdate(order); 

     conn.Commit(); 
     conn.CloseConnection(); 

     return "Success"; 
    } 
    catch (Exception err) 
    { 
     return "Error: " + err; 
    } 
} 

null 제약 조건이 없기 때문에 모든 것이 잘 컴파일되고 데이터베이스에 저장되지만 ordPsi 테이블은 orderID로 업데이트되지 않습니다.

커밋하기 전에 두 개체를 저장하려고했습니다. "orderPsi.order = order"를 설정하지 않고 inverse = "false"를 남겨 두지 만 성공하지는 않습니다.

이 도움말, 나는 가장 다음은이 두 개의 튜토리얼에서 나는 경우

NHibernate-inverse-atribute

one-to-many with inverse

+0

. NET의 일반적인 명명 규칙은 클래스 이름을 대문자, 즉 클래스 순서로 지정하는 것입니다. – abatishchev

+0

코멘트를 주셔서 감사합니다. 그러나이 프로젝트에서는 공식적인 명명 규칙과 다른 표준이 사용됩니다. – gbc921

답변

1

제거가 갱신 = "false"를 당신의 OrdPsi의 매핑 = "false"를 삽입 - 명시 적으로 말해 NHibernate가 업데이트 또는 삽입 할 때 컬럼에 값을 설정하지 않도록 NHibernate는 기본적으로 그것을 삽입 할 때 null 값을 제외합니다.

+0

그게 속임수 였어! 고맙습니다!!! – gbc921

관련 문제