데이터베이스에 다 대일 관계가있는 상위를 저장하려고하면 하위가 올바른 아버지의 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"를 남겨 두지 만 성공하지는 않습니다.
이 도움말, 나는 가장 다음은이 두 개의 튜토리얼에서 나는 경우
. NET의 일반적인 명명 규칙은 클래스 이름을 대문자, 즉 클래스 순서로 지정하는 것입니다. – abatishchev
코멘트를 주셔서 감사합니다. 그러나이 프로젝트에서는 공식적인 명명 규칙과 다른 표준이 사용됩니다. – gbc921