2009-09-20 12 views
6

que tengo una tabla de referencia con todo tipo de datos de valor de búsqueda controladas por género, tipo de dirección, tipo de contacto, etc. Muchas tablas tienen varias claves externas a esta tabla de referenciamúltiples claves ajenas a la misma mesa

también tienen tablas de asociación de muchos a muchos que tienen dos claves externas a la misma tabla. Desafortunadamente, cuando estas tablas se extraen en un modelo de Linq y se genera el DBML, SQLMetal no mira los nombres de las columnas de clave externa, o los nombres de las restricciones, sino solo en la tabla de destino. Así que termino con miembros llamados Reference1, Reference2, ... no muy amigables con el mantenimiento. Ejemplo:

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

puedo entrar en el DBML y cambiar manualmente los nombres de los miembros, por supuesto, pero esto significaría ya no puedo ida y vuelta mi esquema de base de datos. Esta no es una opción en la etapa actual del modelo, que aún está evolucionando. No es deseable dividir la tabla de referencia en n tablas individuales.

Probablemente pueda escribir un script que se ejecute contra el XML después de cada generación y reemplaza el nombre del miembro con algo derivado de ThisKey (ya que sigo una convención de nomenclatura para este tipo de claves). ¿Alguien ha encontrado una mejor solución a este problema?

+0

Esto parece relevante: http://stackoverflow.com/questions/3736003/sqlmetal-multiple-foreign-keys-pointing-to-one-table-issue – DenNukem

Respuesta

3

Así que fui por la ruta de las clases parciales. Por ejemplo, agregué el siguiente miembro para abordar el primer miembro de referencia en mi ejemplo original:

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

Esto está lejos de ser perfecto. Requiere una cantidad sustancial de código adicional en un modelo grande, y depende del orden de los atributos para no cambiar (si se agrega otra clave externa a la tabla de referencia en la tabla de la cuenta, este miembro puede señalar a otra cosa que no sea preferencia de envío). También hay un lado positivo. Como ya estoy escribiendo clases parciales para otros fines, al agregar estos miembros no es necesario que vuelva a crear la aplicación.

2

La herramienta ms actual para LINQ es algo limitada y no parece que vaya a haber mucho esfuerzo para el 2010. Puede escribir su propio generador de código, consulte Damien's t4 templates o PLINQO. También encontré EDMDesigner que valdría la pena ver.

+0

Gracias por los enlaces de interés. Miré a ambos: las plantillas de Damien no parecen hacer lo que necesito. PLINQO parece ser más configurable, pero requiere Codesmith, que no es gratuito. Voy a probar un enfoque con clases parciales que de alguna manera exponen a estos miembros con nombres más significativos. – cdonner

0

mi xml de sqlmetal tenía valores predeterminados mucho más razonables. no es perfecto, pero es mejor El primer FK obtuvo el nombre de la tabla, pero el segundo obtuvo el nombre del campo.

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

versión 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

En VS2010 en realidad se puede cambiar el nombre de las propiedades para padres e hijos en la vista. Aunque está un poco escondido.

  1. En el visor de dbml seleccione la relación que le molesta.
  2. En la grilla Propiedades, tendrá dos filas Propiedad secundaria y secundaria.
  3. expandirlas allí se puede cambiar el nombre de la propiedad

Más detalles se pueden encontrar aquí: http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

que es donde lo tengo desde.

+0

No he encontrado para obtener los cambios para sobrevivir a otra actualización de ida y vuelta desde la base de datos :( –

Cuestiones relacionadas