亚音速3简单存储库和交易

时间:2009-07-16 05:16:55

标签: subsonic3

所以这就是我到目前为止所拥有的。我做错了还是3.0.0.3中有错误?

    var Repository = new SimpleRepository("DBConnectionName");

    using (TransactionScope ts = new TransactionScope())
    {
        using (SharedDbConnectionScope scs = new SharedDbConnectionScope("connstring", "providerName"))
        {
            try
            {
                for (int i = 0; i < 5; i++)
                {
                    Supplier s = new Supplier();
                    s.SupplierCode = i.ToString();
                    s.SupplierName = i.ToString();

                    Repository.Add<Supplier>(s);
                }

                ts.Complete();
            }
            catch
            {
            }
        }
    }

我在SubSonic DbDataProvider中收到错误         public DbConnection CurrentSharedConnection         {             get {return __sharedConnection; }

        protected set
        {
            if(value == null)
            {
                __sharedConnection.Dispose();

等。 __sharedConnection == null :(对象空引用异常:(

3 个答案:

答案 0 :(得分:0)

也许切换SharedDbConnectionScope和TransactionScope可能会有所帮助。

using (SharedDbConnectionScope scs = new SharedDbConnectionScope("connstring", "providerName"))
{
    using (TransactionScope ts = new TransactionScope())
    {
    }
}

答案 1 :(得分:0)

设置迁移时会发生这种情况 - 在tablemigration上将关闭dbconnection。

使用SimpleRepositoryOptions.None尝试SimpleRepository。

不知道这是不是一个错误。我认为事务不能与SimpleRepository一起使用,在事务中抛出异常时,我总是保存了一半的数据...也许它只适用于ActiveRecord?有人知道吗?

答案 2 :(得分:0)

终于为自己解决了这个问题。所有上述代码对我来说都不起作用(SubSonic 3.0.0.3,使用SQLite),但添加BeginTransaction()使其按预期工作,大大加快了事务的速度,并在发生异常时回滚更新。

using (SharedDbConnectionScope sharedConnectionScope = new SharedDbConnectionScope(Access.Provider))
{
    using (IDbTransaction ts = sharedConnectionScope.CurrentConnection.BeginTransaction())
    {
        IRepository repo = new SimpleRepository(Access.Provider);
        //Do your database updates

        //throw new ApplicationException("Uncomment this and see if the updates get rolled back");
        ts.Commit();
    }
}

为了完整性:Access.Provider是一个帮助类的静态属性,返回return SubSonic.DataProviders.ProviderFactory.GetProvider(ConnectionString, "System.Data.SQLite");