많은 질문과 답변을 읽었지만 문제에 대한 해결책을 찾지 못했습니다. 이 문제는 NHibernate 1.2.1에서 2.1.2로 마이그레이션 할 때 발생합니다. 이 일반적인 오류가 있습니다 :NHibernate 2.1.2 저장되지 않은 일시적인 인스턴스
개체는 저장되지 않은 일시적인 인스턴스를 참조합니다. - 플러시하기 전에 임시 인스턴스를 저장하십시오. 유형 : Mikro.FareOn.Modules.Cards.Interface.BEC.CRResidenceRegion, 엔티티 : Mikro.FareOn.Modules.Cards.Interface.BEC.CRResidenceRegion
NHibernate configuration: <nhibernate> <add key="hibernate.show_sql" value="true" /> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="dialect" value="NHibernate.Dialect.MsSql2005Dialect" /> <add key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" /> <add key="driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="connection.connection_string" value="..." /> </nhibernate>
메인 클래스의 CRResidence의 매핑 :
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> <class name="Mikro.FareOn.Modules.Cards.Interface.BEC.CRResidence, Mikro.FareOn.Modules.Cards.Interface" table="CR_Residence"> <id name="Id" column="id" type="Int64" access="nosetter.camelcase" unsaved-value="0"> <generator class="identity" /> </id> <version name="VersionId" column="version_id" type="Int64" /> <property name="IsDeleted" column="deleted" type ="Boolean" not-null="true" /> <property name="Name" column="name" type="String" not-null="true" /> <many-to-one name="Region" column="region_id" cascade="none" class="Mikro.FareOn.Modules.Cards.Interface.BEC.CRResidenceRegion, Mikro.FareOn.Modules.Cards.Interface"/> <property name="Postcode" column="postcode" type="String" not-null="true" /> <many-to-one name="Country" column="residence_country_id" cascade="none" class="Mikro.FareOn.TransportOperator.Interface.BEC.TOResidenceCountry, Mikro.FareOn.TransportOperator.Interface"/> </class> </hibernate-mapping>
그리고 관계의 클래스 중 하나 다 대일 : 클래스 CRResidenceRegion의
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> <class name="Mikro.FareOn.Modules.Cards.Interface.BEC.CRResidenceRegion, Mikro.FareOn.Modules.Cards.Interface" table="CR_ResidenceRegion" > <id name="Id" column="id" type="Int64" access="nosetter.camelcase" unsaved-value="0"> <generator class="identity" /> </id> <version name="VersionId" column="version_id" type="Int64" /> <property name="Name" column="name" type="String" not-null="true" /> <property name="IsDeleted" column="deleted" type ="Boolean" not-null="true" /> </class> </hibernate-mapping>
구현 :
[Serializable] public class CRResidence : BussinesEntityComponentBase //this is class, which implements Equals and define Id, VersionId, IsDeleted { string name; string postcode; CRResidenceRegion region; TOResidenceCountry country; #region Getters/Setters /// /// Nazev mista /// public string Name { get { return this.name; } set { this.name = value; } } /// /// Region /// public CRResidenceRegion Region { get { return this.region; } set { this.region = value; } } /// /// Stát /// public TOResidenceCountry Country { get { return this.country; } set { this.country = value; } } /// /// PSC /// public string Postcode { get { return this.postcode; } set { this.postcode = value; } } public string PostcodeAndName { get { return String.Format("{0} - {1}", Postcode, Name); } } public string NameAndPostcode { get { return String.Format("{1} - {0}", Postcode, Name); } } #endregion /// /// Konstruktor objektu rezidence /// public CRResidence() : base() { } }
모든 유형의 캐스케이드를 시도했지만 모든 캐스케이드가 올바르게 작동하지 않습니다. 하지만 제 경우에는 계단식 = "없음"을 선호합니다. 하나의 NHibernate 세션에서 서버 쪽에서 메서드를 호출하여 CRResidenceRegion 개체를로드하는 클라이언트 쪽을 가지고 있습니다. 로드 한 후 NHibernate 세션이 닫힙니다. 클라이언트의 객체가 정확하고 데이터베이스의 올바른 ID 등등. 그런 다음 CRResidence 객체에는 CRResidenceRegion 객체가 할당됩니다. 서버 측에서 다음 그것은 호출 방법 : 내가 NHibernate에 2.1.2로 마이그레이션 할 때
using (PersistenceSession session = Registrator.OpenSession()) { ITransaction trx = session.BeginTransaction(); try { session.Update(residence); //residence.Region = (CRResidenceRegion)session.Get(typeof(CRResidenceRegion), residence.Region.Id); //residence.Country = (TOResidenceCountry)session.Get(typeof(TOResidenceCountry), residence.Country.Id); trx.Commit(); log.Debug("CRResidence updated."); return residence; } catch (Exception ex) ............ }
나는이 같은 많은 개체가이 문제는 appered. 캐스케이드 스타일 ("none"뿐만 아니라 "all", 내가 필요한 곳)을 정의한 후에 어떤 경우에는 잘 작동합니다. NHibernate의 구성 파일에 문제가있을 수 있습니다.
이전 정의 문제 : CRResidence 인스턴스를 삽입하거나 업데이트하려고하면 저장되지 않은 일시적인 오류에 대한 오류가 발생합니다. ID를 포함하여 CRResidenceRegion의 인스턴스가 완전히 초기화되므로 아무런 문제가 없습니다. Id에 Equal 메서드를 구현했습니다. 캐시를 지우려고했지만 도움이되지 않았습니다. 캐스케이드를 save-update로 변경하면 작동하지만 CRResidenceRegion의 레코드는 복제됩니다. 한 가지 해결책은 CRResidence를 저장하기 전에 동일한 세션 (아래 코드에서 설명 함)에서 데이터베이스의 CRResidenceRegion을 읽는 것이지만 이는 허용되지 않습니다.
NHibernate는 적절하게 CRResidenceRegion에 대한 참조를 잃어 버렸고 새로운 것으로 생각하지만 그렇지 않습니다.
답장을 보내 주셔서 감사합니다.하지만 같은 오류가 다시 발생합니다. – Cvachtoun
개체를 검색하고 수정하는 방법으로 질문을 업데이트 할 수 있습니까? – Meligy
또한 매핑에서'cascade' 속성을 변경하려고 시도 했습니까? – Meligy