2011-03-13 15 views
6

Necesito actualizar periódicamente mis clases de Linq a SQL; Sí, lástima que no haya pensado lo suficiente en mi esquema de datos, desarrollador malo, ad nauseum. Descubrí que SQLMetal casi resuelve el problema, pero tal vez me falta algo de la lista de parámetros.SQLMetal genera clases pero no constructores sin parámetros

Cuando ejecuto mi archivo por lotes de mi botón brillante nueva barra de herramientas usando Herramientas de Visual Studio externos,

@echo off 
del c:\path\to\LinqToSql.dbml 
SQLMetal.exe /server:SERVER\SQLSERVER /database:db /timeout:0 /dbml:"c:\path\to\LinqToSql.dbml" /namespace:DAL /context:DataDataContext /entitybase:System.Data.Linq.DataContext /language:csharp /pluralize 

SQLMetal genera el archivo .dbml, hurra. Sin embargo, Pregunta 1 ¿Puedo incluir programáticamente el archivo .dbml en mi proyecto?

Pregunta 2

Por qué, cuando compilo después de incluir manualmente el archivo .dbml recién generado, hacer cada una de mis clases tienen la siguiente construir los errores asociados con el número de línea de sus constructores sin parámetros? p.ej. 30 tablas = 30 errores de compilación.

'System.Data.Linq.DataContext' does not contain a constructor that takes 0 arguments 

El actual

Me di cuenta de mi DataDataContext clase generada es sin un constructor sin parámetros, por lo que añadió una clase parcial para complementar, pero todavía no hace el truco.

public partial class DataDataContext 
{ 
    public DataDataContext() : 
     base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource) 
    { 
     OnCreated(); 
    } 
} 

pensé que este proceso de actualización podría ser automatizado, pero añadiendo manualmente el archivo .dbml generado que produce estos errores constructor no está funcionando para mí.

+0

Bounty añadido. He usado el OP Designer sin problemas, pero trabajando con SQL Compact y pasando por SQLMetal, creo que muchos de nosotros queremos saber cómo generar un constructor sin parámetros. – aevanko

Respuesta

0

Uso una clase parcial para crear el constructor sin parámetros (como lo hace) y no tengo ningún problema.

Tenga en cuenta que está creando el DataDataContext en el espacio de nombres DAL. (no aparece en el código anterior)

namespace DAL { 
    public partial class DataDataContext 
    { 
     public DataDataContext() : 
      base(global::DAL.Properties.Settings.Default.MyConnectionString, mappingSource) 
     { 
      OnCreated(); 
     } 
    } 
} 
0

1) ¿Realmente necesita el archivo .dbml? Tal vez usted podría generar el archivo de ORM necesaria directamente con algo como esto (y lo han incluido en su solución):

SQLMetal.exe /server:SERVER\SQLSERVER /database:DB /namespace:DAL /code:YourDatamapClass.cs /language:csharp 

luego hacer el archivo por lotes se mueve la clase ahora refrescado a su lugar correcto (a la carpeta de soluciones probablemente)

2) ¿Realmente necesitas un constructor sin parámetros? Por ejemplo, poner la cadena de conexión de base de datos para su archivo de configuración y crear el objeto del asignador con él:

//GetConnectionString (not included here) gets the connection string from config 
DB context = new DB(GetConnectionString()); 
3

La respuesta corta es que SQLMetal no hace constructores sin parámetros. El resto de la respuesta es que su clase parcial debería funcionar, pero debe tener este aspecto:

namespace DAL { 
    public partial class DataDataContext 
    { 
     public DataDataContext() : 
      this(/* Get your connection string here */) 
     { 
      OnCreated(); 
     } 
    } 
} 

Puntos de interés:

  • llamo el este constructor (cadena) en lugar de base, de manera que la
    El evento OnCreated se puede conectar correctamente si lo desea.
  • Obtener la cadena de conexión que le apetezca - una forma sencilla sería

    ConfigurationManager.ConnectionStrings [ "myConnectionString"] ConnectionString

combinarse con lo siguiente en app.config:

.
<connectionStrings> 
    <add 
     name="MyConnectionSTring" 
     connectionString="Data Source=SQLServerName\instance;Initial Catalog=DatabaseName;Persist Security Info=True;User ID=user" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
+0

Gracias, esto es todo lo que necesitaba, sabía cómo configurar el SQLMetal, solo necesitaba un constructor de anulación para obtener la cadena de conexión fuera de la aplicación/web.config en lugar de ponerlo en el constructor todo el tiempo. – Pierre

Cuestiones relacionadas