2010-01-04 2 views
3

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> 

답변

1

나는 당신의 매핑은 매우 옳지 않다 생각합니다. NH documentation을 살펴보면 상위 - 하위 관계에 일대일 매핑을 사용하는 예제는 many-to-one 매핑 (unique = true)과 일대일 매핑 (pair)이 아니라 일대일 매핑을 사용합니다 일대일 맵핑 (한 쌍의 일대일 매핑은 두 개의 테이블이 공유 된 PK를 사용하여 연결된 경우를위한 것입니다.)

매핑을 변경하여 예제와 더 잘 일치하도록 설정하여 계단식을 수정하는지 확인하는 것이 좋습니다.

+0

폴 감사합니다. 그러나 내 두 테이블은 동일한 PK를 공유합니다.이 디자인은 이후입니다. 그래서 일대일 매핑 쌍을 사용하려고합니다. 그러나 캐스케이드는 내가 어떻게 생각 했을까? – j3ffb

+0

미안하지만. 이제 WebpageMetaDataMap이 ID 및 관계에 대해 동일한 열 이름을 갖는 방식을 볼 수 있습니다. 나는 그때 당신의 매핑에 잘못된 것을 볼 수 없다.FNH가 생성하는 XML을 조사한 다음 nhusers 메일 링리스트에서 일대일 폭포가 어떻게 작동하는지에 대해 질문 할 수 있습니다. 미안 나는별로 도움이 아니었다. –

+0

안녕하세요 폴, 문제 없어요. 다른 누군가에게 분명히 잘못한 일을하지 않았다고 말하면 좋을 것입니다. 특히 기술에 처음 접했을 때! FNH가 내 매핑을 위해 만드는 XML을 얻으려면 어떻게해야합니까? 감사합니다 – j3ffb

0

흠, 계단식 모두 삭제 고아?

+0

당신의 도움에 감사드립니다, 그러나 나는 고아를 삭제하는 것이 one-to - 하나의 매핑, 나는 그들이 부모 - 자식 관계에 적용되는 것 같아요? 이런 유형의 관계에서는 고아를 얻을 수 없으며 WebpageMetaData는 웹 페이지가 없으면 존재할 수 없습니다. – j3ffb

+0

one-to-one 캐스케이드 all-delete-orphan은 이제 지원되며 NHibernate 4.1에서 작동합니다. [이] (http://stackoverflow.com/a/44026508/379279) 유창한 nhibernate와 함께 사용할 수 있습니다. – xhafan