2013-01-31 5 views
0

우리 사무실 팀이 일하고 있습니다. NET Framework 4 및 NHibernate 3.3.1을 사용하는 ASP.NET 프로젝트NHibernate Session을 사용하여 복합 키가 포함 된 브리지 테이블에 저장하려고 할 때 외래 키 위반이 발생하는 이유는 무엇입니까?

AllResourcesInfo라는 POCO 도메인 클래스가 있습니다 (궁극적으로는 내부 조인 된 데이터베이스의 리소스 테이블에 매핑 됨) 다른 테이블에서는 AllResourcesInfo가 Resource 테이블에 매핑된다고 가정 해 보겠습니다.

나는 또한 가

나는 또한 궁극적으로 데이터베이스에 다리를 테이블에 매핑 ResourcesInSectionBridge (라는 마시고 도메인 클래스를 호출 한

(궁극적으로 데이터베이스의 섹션 테이블에 매핑)를 마시고 도메인 클래스라는 섹션이 ResourcesInSectionBridge)

명명 규칙에서 알 수 있듯이 ResourcesInSectionBridge는 리소스와 섹션 간의 브리지 테이블입니다.

ResourcesInSectionBridge에 복합 키가 포함되어 있으므로 ResourcesInSectionIdentifier라는 POCO 복합 키 식별자를 만들고 Equals (개체 obj) 메서드와 GetHashCode 메서드를 정의했습니다.

예외 정보 : System.Data.SqlClient.SqlException : 외래 키 제약 "FK_와 충돌 INSERT 문

내가 NHibernate에 세션이 ResourcesInSectionBridge 테이블에 대한 새 항목을 저장하는 데 사용

다음 오류가 발생합니다 리소스 _Resou__22CA2527 ". 데이터베이스 "perls", 테이블 "dbo.Resources", 열 'ResourceDatabaseID'에서 충돌이 발생했습니다. 명세서가 종료되었습니다.

다음과 같이 AllResourcesInfo.hbm.xml에 대한 매핑은 다음과 같습니다

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="PivotServer" 
       namespace="PivotServer.Domain" 
       auto-import="false"> 
    <class name="AllResourcesInfo" table="Resources"> 
    <id name="ResourceDatabaseID"> 
     <generator class="guid" /> 
    </id> 
    <property name="ResourceName" /> 
    <property name="DescriptionOfResource" /> 
    <property name="UserId" /> 
    <property name="DepartmentDatabaseID" /> 
    <property name="ResourceStatus" /> 
    <property name="isRemoved" /> 
    <property name="isSubmitted" /> 
    <property name="ResourcePlacement" /> 
    <property name="ResourceType" /> 
    <property name="ParentResourceID" /> 
    <joined-subclass  name="Imageitems"> 
     <key column="ResourceDatabaseID"/> 
     <property column="DirectoryPathToFile" name="location"/> 
     <property column="ImageIconPath" name="link"/> 
     <property column="YearOfResource" name="YearOfResource"/> 
     <property column="ArtistAuthor" name="ArtistAuthor"/> 
     <property column="UploadDate" name="UploadDate"/> 
     <property column="ImageitemDatabaseID" name="NativeItemDatabaseID"/> 
    </joined-subclass> 
    <joined-subclass  name="UriItems"> 
     <key column="ResourceDatabaseID"/> 
     <property column="uriIconPath" name="location"/> 
     <property column="UriLink" name="link"/> 
     <property column="YearOfResource" name="YearOfResource"/> 
     <property column="ArtistAuthor" name="ArtistAuthor"/> 
     <property column="UploadDate" name="UploadDate"/> 
     <property column="UriItemDatabaseID" name="NativeItemDatabaseID"/> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

이 다음에 Section.hbm.xml에 대한 매핑이 될 때 :

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="PivotServer" 
       namespace="PivotServer.Domain" 
       auto-import="false"> 
    <class name="Section" table="Section"> 
    <id name="SectionDatabaseID"> 
     <generator class="guid" /> 
    </id> 

    <many-to-one name="Courses" 
    column="CourseDatabaseID" class="Courses" 
    fetch="select"/> 

    <many-to-one name="instructorUser" column="UserId" class="Users" 
    fetch="select"/> 

    <many-to-one name="term" 
    column="TermDatabaseID" class="Term" 
    fetch="select"/> 

    <property column="SectionCode" name="SectionCode" /> 

    <set name="setOfTutorials" inverse="false" lazy="true" fetch="select" > 
     <key column="TutorialDatabaseID"/> 
     <one-to-many class="Tutorial"/> 
    </set> 
    </class> 
</hibernate-mapping> 

을 마지막으로, 우리의 ResourcesInSectionBridge.hbm을 .xml 매핑 파일은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="PivotServer" 
       namespace="PivotServer.Domain" 
       auto-import="false"> 
    <class name="ResourcesInSectionBridge" table="ResourcesInSectionBridge" lazy="true" > 
    <composite-id name="ResourcesInSectionIdentifier" class="ResourcesInSectionIdentifier"> 
     <key-property name="ResourceDatabaseID" column="ResourceDatabaseID" type="Guid" /> 
     <key-property name="SectionDatabaseID" column="SectionDatabaseID" type="Guid" /> 
     </composite-id> 

    <many-to-one name="AllResourcesInfo" class="AllResourcesInfo" cascade="none" insert="false" update="false"> 
     <column name="ResourceDatabaseID"></column> 
     <column name="ResourceDatabaseID"></column> 
    </many-to-one> 
    <many-to-one name="Section" class="Section" cascade="none" insert="false" update="false"> 
     <column name="SectionDatabaseID"></column> 
     <column name="SectionDatabaseID"></column> 
    </many-to-one> 
    </class> 

</hibernate-mapping> 

마지막으로 C# 코드는 항목을 만들려고합니다.

예외 정보 : System.Data.SqlClient.SqlException

ResourcesInSectionBridge resInSectionBridgeEntity = new ResourcesInSectionBridge(); 
ResourcesInSectionIdentifier resInSectionIdentifier = new ResourcesInSectionIdentifier(); 
resInSectionIdentifier.ResourceDatabaseID = aSpecificResource.ResourceDatabaseID; 
resInSectionIdentifier.SectionDatabaseID = sectionOfInterest.SectionDatabaseID; 
resInSectionBridgeEntity.ResourcesInSectionIdentifier = resInSectionIdentifier; 

resInSectionBridgeEntity.Section = sectionOfInterest; 
resInSectionBridgeEntity.AllResourcesInfo = aSpecificResource; 

using (ISession session = NHibernateHelper.OpenSession()) 
{ 
     session.Evict(aSpecificResource); 
     session.Evict(sectionOfInterest); 
     session.Clear(); 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
       session.Save(resInSectionBridgeEntity); 

       transaction.Commit(); 
     } 

} // end of using (ISession session = NHibernateHelper.OpenSession()) 

내가 NHibernate에 세션이 ResourcesInSectionBridge 테이블에 대한 새 항목을 저장하는 데 사용

다음 나는 오류가 다음과 같이 ResourcesInSectionBridge 테이블에 있습니다 : INSERT 문이 FOREIGN KEY 제약 조건 "FK_ 리소스 _Resou__22CA2527"과 충돌했습니다. 데이터베이스 "perls", 테이블 "dbo.Resources", 열 'ResourceDatabaseID'에서 충돌이 발생했습니다. 명세서가 종료되었습니다.

왜이 오류가 발생하는지 설명해주세요. 또한 문제 해결 방법에 대해 제안 해 주시겠습니까?

답변

1

표시되는 오류는 데이터베이스에서 발생했으며 ResourceDatabaseID 키의 값이 Resources 테이블에 존재하지 않는다고 말합니다.브리지 테이블에 대한 항목은 이후에 이어야하며, 두 원본 테이블에 항목이없는 경우 삽입해야합니다.

브리지 테이블에 삽입하기 위해 ResourceSection 엔티티를 올바르게 채워야합니다. sample code for many-to-many mappings from these sample에서 달성하고자하는 것과 비슷한 것을 찾으십시오. 제품을 요구하지 않고 샘플을 다운로드 할 수 있습니다.

+0

감사합니다 Sixto, 맞습니다. 모든 제로 값의 Guid 값을 삽입했는데 Resources라는 한쪽 부모 테이블에 분명히 존재하지 않는다고 불평했습니다. 자존심이 옆으로 밀려 나옵니다 :) – user1338998

+0

고마워요! 나는 유사한 오류에 대한 나의 공평한 분배보다 더 많은 것을 만들었습니다 ... –

+1

BTW : SQL Server와 GUID 기본 키를 사용하는 경우 GUID PK 열이 클러스터링 키가 아닌지 확인하십시오. 데이터를 클러스터링하기위한 기초로서 사실상 난수를 사용하면 나쁜 일이 일어납니다. 다른 컬럼을 선택하여 의미있는 클러스터링 키를 작성하십시오. –