2009-09-20 1 views
6

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

Я также имеют таблицы ссылок «многие-ко-многим», которые имеют два внешних ключа к одной таблице. К сожалению, когда эти таблицы втягиваются в модель 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 после каждого поколения и заменяет имя участника чем-то, полученным из этого ключа (поскольку я придерживаюсь соглашения об именах для этих типов ключей). Кто-нибудь нашел лучшее решение этой проблемы?

+0

Это кажется уместным: http://stackoverflow.com/questions/3736003/sqlmetal-multiple-foreign-keys-pointing-to-one-table-issue – DenNukem

ответ

3

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

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

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

2

Текущая функция ms для LINQ - это то, что ограничено, и на самом деле это не похоже, что много усилий придет на vs 2010. Вы можете написать свой собственный генератор кода, посмотрите на Damien's t4 templates или PLINQO. Я также нашел EDMDesigner, который, возможно, стоит посмотреть.

+0

Спасибо за интересные ссылки. Я посмотрел на оба - шаблоны Дэмиена, похоже, не делают то, что мне нужно. PLINQO кажется более настраиваемым, но требует Codesmith, который не является бесплатным. Я собираюсь попробовать подход с частичными классами, чтобы каким-то образом выявить этих членов с более значимыми именами. – cdonner

0

Мой 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. 
    ... 
3

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

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

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

Что, где я получил его от.

+0

Не нашли профайл, чтобы получить изменения, чтобы выжить в другом обновлении в оба конца из базы данных :( –