0

私たちのオフィス チームは、.NET Framework 4 と NHibernate 3.3.1 を使用する ASP.NET プロジェクトに取り組んでいます。

私は AllResourcesInfo という POCO ドメイン クラスを持っています (これは最終的にデータベース内のリソース テーブルにマップされ、他のテーブルに内部結合されますが、簡単にするために、AllResourcesInfo がリソース テーブルにマップされているとしましょう)。

Section という POCO ドメイン クラスもあります (これは最終的にデータベースの Section テーブルにマップされます)。

ResourcesInSectionBridge という POCO ドメイン クラスもあります (これは、最終的に ResourcesInSectionBridge というデータベースのブリッジ テーブルにマップされます)。

命名規則が示すように、ResourcesInSectionBridge は Resource と Section の間のブリッジ テーブルです。

ResourcesInSectionBridge には複合キーが含まれているため、ResourcesInSectionIdentifier という POCO 複合キー識別子を作成し、Equals(object obj) メソッドと GetHashCode メソッドも定義しました。

NHibernate セッションを使用して ResourcesInSectionBridge テーブルの新しいエントリを保存すると、エラーが発生します。

例外の詳細: System.Data.SqlClient.SqlException: INSERT ステートメントが FOREIGN KEY 制約 "FK_ Resources _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>

最後に、ResourcesInSectionBridge テーブルにエントリを作成しようとする C# コードは次のとおりです。

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 テーブルの新しいエントリを保存すると、エラーが発生します。

例外の詳細: System.Data.SqlClient.SqlException: INSERT ステートメントが FOREIGN KEY 制約 "FK_ Resources _Resou__22CA2527" と競合しました。データベース「perls」、テーブル「dbo.Resources」、列「ResourceDatabaseID」で競合が発生しました。ステートメントは終了されました。

このエラーが発生する理由を教えてください。また、問題を解決する方法を教えてください。

4

1 に答える 1

2

表示されているエラーはデータベースからのもので、ResourceDatabaseIDキーの値がテーブルに存在しないことを示していResourcesます。ブリッジ テーブルに作成されるエントリは、2 つのソース テーブルに項目がまだ存在しない場合、それらの項目が挿入された後である必要があります。

ブリッジ テーブルへの挿入を機能させるには、Resourceとエンティティの両方を適切に設定する必要があります。これらのサンプルの多対多マッピングSectionのサンプル コードを見て、達成しようとしていることに似たものを見つけてください。製品を必要とせずにサンプルをダウンロードできます。

于 2013-01-31T20:54:42.857 に答える