1

nhibernate を使用してレガシー データベースをマッピングしていますが、リレーションのマッピングに問題があります。

2つのクラスは次のようになります

public class Questionnaire
{
    public int Id {get; set;}
    public string FormCode {get; set;}
    public IList<Question> Questions {get; set;}
}

public class Question
{
    public int Id{get; set;}
    public Questionnaire Questionnaire {get;set;}
    public string QuestionText{get;set;}
}

このようなテーブルに

Questionnaire Table  
Id int  
FormCode varchar(100)  

Question Table  
Id int  
FormCode varchar(100)  
QuestionText varchar(max)  

フォームコード列である 2 つのテーブル間の関係。

私の現在のマッピングはこのようなものです

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core">
<class name="Questionnaire" table="_questionnaire_list">
    <id column="Id" name="Id">
            <generator class="identity"/>
    </id>
        <property name="FormCode" column="FormCode"/>
        <bag name="Questions" >
            <key foreign-key="FormCode" property-ref="FormCode" />
            <one-to-many class="Question" />            
        </bag>
</class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="QDesign.Core.Models" assembly="QDesign.Core">
<class name="Question" table="_questionnaire_items">
    <id column="ID" name="Id" unsaved-value="-1">
            <generator class="identity" />
        </id>
        <property name="QuestionText" column="QuestionText" />
</class>
</hibernate-mapping>

マッピングを実行すると、フォームコードを質問の Id に入れようとしていると仮定して、識別子の型が一致しません。残念ながら、テーブルの構造を変更することはできません。これをマップする方法がわかりません。助けていただければ幸いです。

4

2 に答える 2

4

あなたの関係は、中間エンティティのない m:n の関係です。このように m:n 関係を定義するのは典型的な間違いです。pk 側が切り取られ、同じ属性/フィールドを持つ 2 つのテーブルがあり、意味的に同じものを表しているという状況につながるからです。ただし、両側で非 pk 値であるため、冗長性と不正確さの可能性があります。2 つのフィールドで 2 つのテーブルを結合できますが、意味的には意味がありません。エンティティ モデルがエンティティ X を Y に関連付ける場合、FK 側は関係の PK 側を FK フィールドとして取得し、m:n 関係の場合は、中間エンティティに由来する 2 つの m:1 関係が必要です。それだけです、例外はありません。

したがって、提案した方法でこれをマップしたい場合でも、提案された関係が単に正しくないため、o/r マッパーが正確性を保証できないため、これを行うことはできません。

于 2009-02-08T10:38:35.387 に答える
2

これが ORM の「問題」です。私が「問題」と言ったのは、Hibernate が技術的に正しいためです。外部キーは主キーでなければなりません。しかし、あなたが目撃しているように、常にそうであるとは限りません。

IDは実際に何かに使用されますか? そうでない場合は、FormCode を主キーにするのが最も抵抗の少ない方法です。それはオプションですか?

そうでない場合、質問を子エンティティとして扱うのではなく、質問を照会する以外に何をすべきか本当にわかりません。

于 2009-02-08T03:44:24.320 に答える