Несколько внешних ключей к одной таблице - PullRequest
7 голосов
/ 20 сентября 2009

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

У меня также есть таблицы сопоставления «многие ко многим», в которых есть два внешних ключа к одной и той же таблице. К сожалению, когда эти таблицы включаются в модель Linq и генерируется DBML, SQLMetal не смотрит на имена столбцов внешнего ключа или имена ограничений, а только на целевую таблицу. Таким образом, я получаю членов с именами Reference1, Reference2, ... не очень удобных для обслуживания. Пример:

  <Association Name="tb_reference_tb_account" Member="tb_reference" <======
  ThisKey="shipping_preference_type_id" OtherKey="id" Type="tb_reference"
  IsForeignKey="true" />
  <Association Name="tb_reference_tb_account1" Member="tb_reference1" <======
  ThisKey="status_type_id" OtherKey="id" Type="tb_reference" 
  IsForeignKey="true" />

Конечно, я могу зайти в DBML и вручную изменить имена членов, но это означает, что я больше не могу обходить схему своей базы данных. Это не вариант на текущем этапе модели, которая все еще развивается. Разделение справочной таблицы на n отдельных таблиц также нежелательно.

Я, вероятно, могу написать скрипт, который запускается для XML после каждого поколения и заменяет имя элемента чем-то, полученным из ThisKey (поскольку я придерживаюсь соглашения об именах для этих типов ключей). Кто-нибудь нашел лучшее решение этой проблемы?

Ответы [ 4 ]

3 голосов
/ 18 августа 2010

В VS2010 Вы можете фактически переименовать свойства для родителя и потомка в представлении. Это немного скрыто, хотя.

  1. В программе просмотра dbml выберите отношения, которые вас беспокоят.
  2. В сетке свойств у вас будет две строки Child и Parent Property.
  3. Разверните их там, вы можете изменить название объекта

Более подробную информацию можно найти здесь: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

Откуда я это взял.

3 голосов
/ 21 сентября 2009

Итак, я пошел по маршруту неполных классов. Например, я добавил следующий элемент для адресации первого ссылочного элемента в моем исходном примере:

public partial class tb_account
{
    public tb_reference shipping_preference_reference
    {
        get
        {
            return this._tb_reference.Entity;
        }
        set
        {
            this.tb_reference = value;
        }
    }

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

2 голосов
/ 20 сентября 2009

Текущие инструменты MS для LINQ несколько ограничены, и не похоже, что в сравнении с 2010 г. будут приложены большие усилия. Вы можете написать свой собственный генератор кода, посмотрите шаблоны t4 Дэмиена или PLINQO . Я также нашел EDMDesigner , который, возможно, стоит посмотреть.

0 голосов
/ 02 июня 2010

мой xml из sqlmetal имел гораздо более разумные значения по умолчанию. не идеально, но лучше. Первый FK получил имя таблицы, а второй - имя поля.

  <Association Name="FK_Product_DefaultOutputTypeID" Member="OutputType"
   ThisKey="DefaultOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
   IsForeignKey="true" />
  <Association Name="FK_Product_DefaultTileOutputTypeID" Member="DefaultTileOutputType"
   ThisKey="DefaultTileOutputTypeID" OtherKey="OutputTypeID" Type="OutputType"
   IsForeignKey="true" />

sqlmetal версия:

  C:\Program Files\Microsoft Visual Studio 9.0\VC>sqlmetal /?
  Microsoft (R) Database Mapping Generator 2008 version 1.00.21022
  for Microsoft (R) .NET Framework version 3.5
  Copyright (C) Microsoft Corporation. All rights reserved.
  ...
...