SQLMetal генерирует классы, но не конструкторы без параметров - PullRequest
6 голосов
/ 13 марта 2011

Мне нужно регулярно обновлять классы Linq To SQL; Да, мне стыдно за то, что я недостаточно тщательно продумал мою схему данных, плохой разработчик, до тошноты. Я обнаружил, что SQLMetal почти добился цели, но, возможно, мне чего-то не хватает в списке параметров.

Когда я запускаю свой пакетный файл с новой блестящей кнопки на панели инструментов, используя внешние инструменты Visual Studio,

@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 создает файл .dbml, ура. Однако Вопрос 1 Могу ли я программно включить файл .dbml в свой проект?

Вопрос 2

Почему, когда я компилирую после того, как вручную включаю только что созданный файл .dbml, у каждого из моих классов возникают следующие ошибки сборки, связанные с номером строки их конструкторов без параметров? например 30 таблиц = 30 ошибок сборки.

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

Фактический

Я заметил, что мой DataDataContext сгенерированный класс без конструктора без параметров, поэтому я добавил частичный класс для дополнения, но он все еще не работает.

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

Я думал, что этот процесс обновления можно будет автоматизировать, но ручное добавление сгенерированного файла .dbml, который вызывает эти ошибки конструктора, не работает для меня.

Ответы [ 3 ]

3 голосов
/ 02 ноября 2011

Короткий ответ: SQLMetal не делает конструкторов без параметров.Остальная часть ответа заключается в том, что ваш частичный класс должен работать, но он должен выглядеть следующим образом:

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

Достопримечательности:

  • Вместо этого вызовите конструктор this (string)базы, так что событие
    OnCreated может быть правильно связано, если вы решите.
  • Получите строку подключения так, как вы хотите - простой способ будет

    ConfigurationManager.ConnectionStrings ["MyConnectionSTring"]. ConnectionString

в сочетании со следующим в 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 голосов
/ 02 ноября 2011

1) Вам действительно нужен файл .dbml?Возможно, вы могли бы сгенерировать необходимый ORM-файл напрямую с помощью чего-то вроде этого (и включить его в свое решение):

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

Затем заставить командный файл переместить обновленный класс на правильное место (в решение).папка, вероятно).

2) Вам действительно нужен конструктор без параметров?Например, поместите строку подключения к БД в свой файл конфигурации и создайте объект сопоставления с ним:

//GetConnectionString (not included here) gets the connection string from config
DB context = new DB(GetConnectionString()); 
0 голосов
/ 09 апреля 2011

Я использую частичный класс для создания конструктора без параметров (как и у вас), и у меня нет проблем.

Остерегайтесь того, что вы создаете DataDataContext в пространстве имен DAL.(чего нет в вашем коде выше)

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