1

我是 SubSonic 的新手(各种风格),但我想我不妨从 3.0 开始,因为我想使用 Linq,而且我的印象是 3.0 离发布不远了。

我尝试了 alpha 下载 .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 的简单模板中已修复

4

2 回答 2

2

不知道您是否从 SVN 获得了带有错误的最新位,但我几天前的版本似乎工作正常。这是我的 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();

    }

... ETC...

我使用了模板的高级版本。

于 2009-04-16T22:31:49.550 回答
1

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

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

    }

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

于 2009-04-16T22:38:21.467 回答