I I이 예 간략화 한 다음 DB 테이블 가지고캐스케이드 문제 유창함 NHibernate에를 사용하여 일대일 관계 엔티티를 삭제할 때
웹 페이지 이드 URLIdentifier
WebpageMetaData 웹 페이지 키워드
웹 페이지 ID는 테이블의 기본 키이며 웹 페이지 테이블의 기본 키입니다.
public class Webpage
{
public virtual int Id { get; set; }
public virtual string UrlIdentifier { get; set; }
public virtual WebpageMetaData WebpageMetaData { get; set; }
}
public class WebpageMetaData
{
public virtual int Id { get; set; }
public virtual string Keywords{ get; set; }
public virtual Webpage Webpage { get; set; }
} 나는 이러한 엔티티를 매핑 할
: 나는 다음 POCO 클래스에 이러한 매핑 할 유창함 자 NHibernate하고 자동 매핑 기능을 사용하고
일대일로 다음과 같이 자동 매핑을 재정의합니다.
public class WebpageMap : IAutoMappingOverride<Webpage>
{
public void Override(AutoMapping<Webpage> mapping)
{
mapping.HasOne(w => w.WebpageMetaData)
.Not.Constrained()
.Fetch.Join()
.Cascade.All();
}
}
public class WebpageMetaDataMap : IAutoMappingOverride<WebpageMetaData>
{
public void Override(AutoMapping<WebpageMetaData> mapping)
{
mapping.Id(w => w.Id, "Webpage_id").GeneratedBy.Foreign("Webpage");
mapping.HasOne(w => w.Webpage)
.ForeignKey("Webpage_id")
.Constrained()
.Fetch.Join()
.Cascade.None();
}
}
이러한 매핑과 계단식 규칙을 테스트했으며 선택, 삽입 및 업데이트하기 위해 노력하고 있습니다. 내가 WebpageMetaData의 삭제를 수행하지만 때 나는
유일한 방법으로 "삭제 된 개체가 캐스케이드 (협회에서 삭제 된 개체를 제거) [WebpageMetaData # 524]에 의해 다시 저장됩니다"라고 말하는 예외가 저장하기 전에 다음을 수행하여 예외를 중지하십시오.
그래서 부모로부터 자신에 대한 null 참조를 설정해야합니다. 이게 잘못된 것 같니? 내 매핑 잘못 됐어?
감사합니다.
업데이트 1 : 유창함 생산 된 NH 매핑을 참조하십시오, 이것은 하드 코어에 도움이 있습니다 경우는 NHibernator의 :
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Webpage`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
<column name="Id" />
<generator class="identity" />
</id>
<one-to-one cascade="all" class="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="false" fetch="join" name="WebpageMetaData" />
<property name="UrlIdentifier" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="UrlIdentifier" />
</property>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`WebpageMetaData`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
<column name="Webpage_id" />
<generator class="foreign">
<param name="property">Webpage</param>
</generator>
</id>
<one-to-one cascade="none" class="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="true" fetch="join" foreign-key="Webpage_id" name="Webpage" />
<property name="Keywords" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Keywords" />
</property>
</class>
</hibernate-mapping>
폴 감사합니다. 그러나 내 두 테이블은 동일한 PK를 공유합니다.이 디자인은 이후입니다. 그래서 일대일 매핑 쌍을 사용하려고합니다. 그러나 캐스케이드는 내가 어떻게 생각 했을까? – j3ffb
미안하지만. 이제 WebpageMetaDataMap이 ID 및 관계에 대해 동일한 열 이름을 갖는 방식을 볼 수 있습니다. 나는 그때 당신의 매핑에 잘못된 것을 볼 수 없다.FNH가 생성하는 XML을 조사한 다음 nhusers 메일 링리스트에서 일대일 폭포가 어떻게 작동하는지에 대해 질문 할 수 있습니다. 미안 나는별로 도움이 아니었다. –
안녕하세요 폴, 문제 없어요. 다른 누군가에게 분명히 잘못한 일을하지 않았다고 말하면 좋을 것입니다. 특히 기술에 처음 접했을 때! FNH가 내 매핑을 위해 만드는 XML을 얻으려면 어떻게해야합니까? 감사합니다 – j3ffb