우리 사무실 팀이 일하고 있습니다. 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'에서 충돌이 발생했습니다. 명세서가 종료되었습니다.왜이 오류가 발생하는지 설명해주세요. 또한 문제 해결 방법에 대해 제안 해 주시겠습니까?
감사합니다 Sixto, 맞습니다. 모든 제로 값의 Guid 값을 삽입했는데 Resources라는 한쪽 부모 테이블에 분명히 존재하지 않는다고 불평했습니다. 자존심이 옆으로 밀려 나옵니다 :) – user1338998
고마워요! 나는 유사한 오류에 대한 나의 공평한 분배보다 더 많은 것을 만들었습니다 ... –
BTW : SQL Server와 GUID 기본 키를 사용하는 경우 GUID PK 열이 클러스터링 키가 아닌지 확인하십시오. 데이터를 클러스터링하기위한 기초로서 사실상 난수를 사용하면 나쁜 일이 일어납니다. 다른 컬럼을 선택하여 의미있는 클러스터링 키를 작성하십시오. –