Как мне создать класс контекста Subsononic 3.0 DB? - PullRequest
1 голос
/ 17 апреля 2009

Я новичок в SubSonic (всех разновидностей), но подумал, что с таким же успехом могу начать с 3.0, потому что я хотел бы использовать Linq, и у меня сложилось впечатление, что 3.0 не так уж далека от выпуска.

Я попробовал загрузить альфа-версию .zip, но это кажется довольно старым и не использовало имена таблиц в единственном числе, так что теперь я работаю с последней версии магистрального SVN (rev62).

Я запустил «простые» шаблоны из SubSonic.Templates \ Simple для моей базы данных, и все выглядит нормально, но контекстный класс БД, который создают шаблоны, начинается так:

public partial class DB : IQuerySurface
{
    static DB _db;

    public DB() { 
        _db = new DB();
    }

    public static DB CreateDB()
    {
        if (_db == null)
        {
            _db = new DB();
            _db.Init();
        }
        return _db;
    }
    ... etc

Неудивительно, что когда я вызываю DB.CreateDB, ctor повторяется бесконечно и вылетает все с переполнением стека.

Я не совсем понимаю ctor - он не выглядит так, как будто он должен быть там, но и «простые», и «продвинутые» шаблоны создают нечто похожее, и есть огромный набор тестов, который я представляю это как-то проверяет.

Ясно, что у меня здесь не тот конец палки - какой ослепительно очевидный момент я упустил?

Обновление: Простые и продвинутые шаблоны не похожи, и у продвинутых нет этой проблемы. Спасибо за помощь.

Другое обновление: Похоже, это исправлено в простых шаблонах в SVN r66

Ответы [ 2 ]

2 голосов
/ 17 апреля 2009

Не знаю, есть ли у вас последние биты из SVN с ошибкой, но моя версия несколько дней назад, кажется, работает нормально. Вот с чего начинается мой класс БД:

public partial class DB : IQuerySurface
{
    BatchQuery _batch = null;

    public IDataProvider DataProvider;
    public DbQueryProvider provider;

    private IDatabaseSchema _schema;
    public IDatabaseSchema Schema
    {
        get
        {
          return _schema;
        }
    }

    public DB() 
    { 
        DataProvider = ProviderFactory.GetProvider("Northwind");
        Init();

    }

    public DB(string instanceName, string connectStr)
    {
        SubSonic.DataProviders.ConnectionStringProvider.Instance.AddLocalConnectionString(
              instanceName, connectStr, "System.Data.SqlClient");

        DataProvider = ProviderFactory.GetProvider(instanceName);

        Init();

    }

... и т.д ...

Я использовал расширенную версию шаблонов.

1 голос
/ 17 апреля 2009

Я предпочитаю шаблоны t4, здесь приведен ctor:

    public DB() 
    { 
        DataProvider = ProviderFactory.GetProvider("Northwind");
        Init();

    }

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

...