Linq-to-SQL Ассоциация с проблемой нескольких внешних ключей - PullRequest
1 голос
/ 07 января 2011

Я использую Visual Studio 2008, C #, LINQ to SQL и использую редактор базы данных dbml dbml для создания базы данных.Я хочу создать отношение 1 ко многим, но в моем случае объект 1 имеет 2 первичных ключа.Используя графический редактор, я создал ассоциацию, но когда программа запускается и база данных создается, я получаю сообщение об ошибке:

"Ссылочная таблица должна иметь первичный или кандидатный ключ. [FK Name =Screen_Pixel] "

XML, созданный в dbml, выглядит следующим образом:

<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")]

Есть идеи?

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Поскольку я боролся с чем-то похожим, и этот вопрос был близок к моему, я добавлю свои 2 цента здесь для следующей души, которая может столкнуться с той же проблемой (создание базы данных во время выполнения из объектной модели).

Если ваш составной ключ не обязательно должен быть первичным ключом (т. Е. Вы просто хотите обеспечить уникальность комбинации), решение заключается в следующем:

  • добавитьобычный первичный ключ (столбец с целочисленной идентичностью, сгенерированный в дБ), на который вы будете ссылаться из внешнего ключа.
  • обеспечивают ограничение уникальности дополнительным шагом в вашем DataContext, например:

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

после отправки отправит исключение при попытке вставить дубликаты полей.

0 голосов
/ 08 января 2011

Почему вы используете несколько полей для основного поля (также известного как «составное первичное поле»)?

Некоторые школы и книги учат использовать «Составные первичные ключи», но на самом деле онине хорошая идея.Многие программы не допускают эти поля, и даже если это так, с ними трудно работать.

Всегда лучше использовать первичный ключ для одного поля.

Я предлагаю сохранить эти поляв качестве стандартных полей или внешних ключей, добавляет новое поле , которое присваивается или увеличивается автоматически.

Пример:

<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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...