1

私はVisual Studio 2008、C#、LINQ to SQLを使用しており、datbase dbml GUIエディタを使用してデータベースを作成しています。私は1対多の関係を作成したいが、私の場合、1つのオブジェクトには2つの主キーがある。 GUIのedtiorを使用して、私は関連付けを作成したが、プログラムが実行され、データベースが作成されたとき、私はエラーを取得:複数の外部キーとのLinq-To-SQLの関連付け問題

「参照先テーブルがプライマリまたは候補キーを持っている必要があります[FK名= Screen_Pixel]を。」

DBMLで作成されたXMLは次のようになります。C#コードで生成された団体である

<Table Name="Screen"> 
    <Column Name="PKA1" Type="System.Int64" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 
    <Column Name="PKA2" Type="System.Int32" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 
    <Association Name="Screen_Pixel" Member="Pixels" ThisKey="PKA1,PKA2" OtherKey="PKB1,PKB2" Type="Pixel" /> 
</Table> 

<Table Name="Pixel> 
    <Column Name="PKB1" Type="System.Int64" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 
    <Column Name="PKB2" Type="System.Int32" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 
    <Column Name="PKB3" Type="System.Int32" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 
    <Association Name="Screen_Pixel" Member="Screen" ThisKey="PKB1,PKB2" OtherKey="PKA1,PKA2" Type="Screen" IsForeignKey="true" /> 
</Table> 

[Association([email protected]"Screen_Pixel", [email protected]"_Screen", [email protected]"PKA1,PKA2", [email protected]"PKB1,PKB2", IsForeignKey=true)] 
[Association([email protected]"Screen_Pixel", [email protected]"_Pixels", [email protected]"PKB1,PKB2", [email protected]"PKA1,PKA2")] 

アイデア?

答えて

0

なぜプライマリフィールド(複合プライマリフィールドとも呼ばれます)に複数のフィールドを使用するのですか?

一部の学校や書籍では、「複合主キー」を使用するように教えていますが、実際にはあまり良い考えではありません。多くのソフトウェアはこれらのフィールドを許可していません。たとえそれがあっても処理することは困難です。

単一フィールドの主キーを使用する方が常に良いです。

これらのフィールドを標準フィールドまたは外部キーとして使用することをお勧めします。は、新しいフィールドを自動的に割り当てまたは増分します。

例:

<Table Name="Screen"> <Column Name="ScreenKey" Type="System.Int64" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="ScreenField1" Type="System.Int64" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="ScreenField2" Type="System.Int32" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Association Name="Screen_Pixel" Member="Pixels" ThisKey="ScreenKey" OtherKey="ScreenKey" Type="Pixel" /> 

</Table> 

<Table Name="Pixel> 

<Column Name="PixelKey" Type="System.Int64" IsPrimaryKey="true" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="ScreenKey" Type="System.Int64" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="PixelField1" Type="System.Int64" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="PixelField2" Type="System.Int32" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Column Name="PixelField3" Type="System.Int32" IsPrimaryKey="false" CanBeNull="false" UpdateCheck="Never" /> 

<Association Name="Screen_Pixel" Member="Screen" ThisKey="ScreenKey" OtherKey="ScreenKey" Type="Screen" IsForeignKey="true" /> 

</Table> 
+0

私はデータベースの元の著者ではなく、これがデータベースの作成方法です。複数の外部キーにオブジェクトを定義させる方が簡単で直感的であるため、これを行わないことを望んでいました。私が月曜日までにそれ以上の返信を聞いていないなら、私はそれを打つだろう。 – John

+4

両方の値が不変で、行の一意性を定義するときに複合主キーを使用するのは悪い考えではありません。 ORMソリューションが複合主キーを処理できない場合、ORMソリューションの欠点です。 ORMの制約に合わせてデータをモデリングするべきではありません。 –

1

私は似たようで苦労してきたし、この質問は私の近くに来たので、私は同じ問題でで来るかもしれない次の魂のためにここに私の2セントを追加します(実行時にオブジェクトモデルからデータベースを作成する)。

あなたの複合キーが本当に主キー(つまり、あなただけの組み合わせの一意性を提供したい)である必要はありません場合は解決策があるに:

  • 正規の主キー(整数アイデンティティデシベルを追加生成された列)を外部キーから参照します。
  • 例えば、あなたのDataContextの上に追加のステップで一意性制約を提供:

    yourDataContext.ExecuteCommand("ALTER TABLE Stuff ADD UNIQUE (unique_thing_1, unique_thing_2, unique_thihng_3)"); 
    

はその後、重複フィールドを挿入しようとすると例外がスローされます提出します。

関連する問題