我应该如何创建亚音速3.0 DB上下文类?

时间:2009-04-16 22:07:13

标签: subsonic recursion

我是SubSonic(各种口味)的新手,但我认为不如从3.0开始,因为我想使用Linq,我得到的印象3.0离发布还不远。

我尝试了alpha下载.zip,但这看起来已经很老了,并没有单一化表类名,所以我现在运行的是最新的trunk SVN版本(rev62)。

我运行'简单'模板,从SubSonic.Templates \ Simple对我的数据库,一切似乎都没问题,但模板创建的DB上下文类开始如下:

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 个答案:

答案 0 :(得分:2)

不知道你是否有来自SVN的最新部分有一个bug,但我几天前的版本似乎工作正常。以下是我的DB类开始的内容:

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 :(得分:1)

我更喜欢t4模板,这里提供的是ctor:

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

    }

还有一个接受连接字符串的重载。这对我很有效,我正在使用linq支持,它非常​​棒。