Отношения один-ко-многим динамических данных с использованием полей не-PK: Внешняя таблица Ссылки List.aspx используют неправильный ключ для отношений один-ко-многим - PullRequest
3 голосов
/ 27 ноября 2009

Проблема: неверные URL-адреса, созданные между таблицами с отношениями один-ко-многим. Как я могу это исправить?

Я использую LINQ to SQL с динамическими данными.

У меня есть две таблицы: пользователи и адреса:

* There is a one-to-many from Users TO Addresses ie: A user may have one or more addresses. 
* The two tables are NOT linked using their primary keys, but using a separate GUID field.
* The User table has Id (int) as it's PK and 'PrincipalId' (Guid) as the linking key
* The Addresses table has AddressId(int) as it's PK and 'PrincipalId' (Guid) as the linking key
* 'PrincipalId' is unique in the user table.
* The 'Association' looks good in the DataAccess class, and was done using the dbml designer.

Симптомы:

При просмотре таблицы «Пользователь» в конце появляется столбец со ссылкой «Просмотр адресов пользователей», например: http://dev.cityslurp.com/Addresses/List.aspx?PrincipalId=18

Примечание:

  1. PrincipalId - это GUID, а не int, поэтому я думаю, что «18» на самом деле должно быть GUID
  2. Целое число правильно отображается на значение User.Id
  3. Так что я думаю, что ссылка должна выглядеть следующим образом: http://dev.cityslurp.com/Addresses/List.aspx?PrincipalId=157221EF-C85C-4FDF-B861-60D149E11BFC,, но после этого выдается ошибка: «DropDownList1» имеет значение SelectedValue, которое недопустимо, поскольку его нет в списке элементов. «- Я предполагаю, что эта ошибка связана с тем, что в раскрывающемся списке ожидается целое число.

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

И наоборот, когда я перехожу на страницу Address / List.aspx, у меня появляется столбец со ссылками на страницу сведений о пользователе. Ссылки правильно отображают адрес электронной почты пользователя в виде текста, но опять же ссылка неверна. Например, для того же пользователя его ссылка со страницы списка адресов: http://dev.cityslurp.com/Users/Details.aspx?Id=157221ef-c85c-4fdf-b861-60d149e11bfc

Примечание:

  1. User.Id - это PK для таблицы User
  2. User.Id является целым числом
  3. Используемый Guid является значением из поля «PrincipalId»
  4. Поскольку ссылка содержит текст адреса электронной почты, а Guid верен, может показаться, что отношения работают, просто Id неверен.

Я предполагаю, что ссылка должна выглядеть следующим образом: http://dev.cityslurp.com/Users/Details.aspx?Id=70,, которая работает для просмотра сведений о пользователе.

Я думаю, что это может быть и ошибка, но наверняка другие успешно использовали отношения один-ко-многим, используя не-PK поля раньше?

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

Вот пример отношения в автоматически сгенерированном файле DataAccess:

[Таблица (Name = "dbo.Address")] открытый частичный класс Адрес: INotifyPropertyChanging, INotifyPropertyChanged {

...

 [Association(Name="Users_Address", Storage="_Users", ThisKey="PrincipalId", OtherKey="PrincipalId", IsForeignKey=true)]
    public Users Users
    {
        get
        {

...

Есть идеи, что делать? Я знаю, что могу создавать пользовательские страницы списка для пользователей и адресов, но я ищу более простой способ - возможно, добавив атрибут в один из частичных классов, чтобы сказать им, что делать правильно.

Ура, Lance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...