1

Visual Studio 2008、C#、LINQ to SQL を使用し、データベースを作成するためにデータベース dbml GUI エディターを使用しています。1 対多の関係を作成したいのですが、私の場合、1 つのオブジェクトに 2 つの主キーがあります。GUI edtior を使用して関連付けを作成しましたが、プログラムを実行してデータベースを作成すると、次のエラーが表示されます。

「参照されるテーブルには主キーまたは候補キーが必要です。[ FK 名 = Screen_Pixel ]」

dbml で作成された XML は次のようになります。

<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>  

C# コードで生成される関連付けは次のとおりです。

[Association(Name=@"Screen_Pixel", Storage=@"_Screen", ThisKey=@"PKA1,PKA2", OtherKey=@"PKB1,PKB2", IsForeignKey=true)]
[Association(Name=@"Screen_Pixel", Storage=@"_Pixels", ThisKey=@"PKB1,PKB2", OtherKey=@"PKA1,PKA2")]

何か案は?

4

2 に答える 2

1

私は似たようなことに苦労しており、この質問は私のものに近かったので、同じ問題 (実行時にオブジェクト モデルからデータベースを作成する) で発生する可能性のある次の魂のために、ここに 2 セントを追加します。

複合キーが実際には主キーである必要がない場合 (つまり、組み合わせの一意性を提供したいだけの場合)、解決策は次のとおりです。

  • 外部キーから参照する通常の主キー (整数 ID データベース生成列) を追加します。
  • DataContext に追加のステップを使用して一意性制約を提供します。たとえば、次のようになります。

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

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

于 2011-06-01T09:17:39.283 に答える
0

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

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

常に単一フィールドの主キーを使用することをお勧めします。

私の提案は、これらのフィールドを標準フィールドまたは外部キーとして保持し、新しいフィールドを追加して、自動的に割り当てられるかインクリメントされることです。

例:

<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> 
于 2011-01-07T21:45:47.320 に答える