Грешка в рамката на обект като „Нова транзакция не е разрешена, защото има други нишки, изпълнявани в сесията

Използваме подход първи код на рамка на обект Аз съм нов в рамката на обект и се сблъсквам с грешка, докато се опитвам да направя „Нова транзакция не е разрешена, защото в сесията се изпълняват други нишки.

public class DatabaseBackup : IDataBackup
    {
        private readonly IMonarchDbContext m_db;
        public DatabaseBackup(IMonarchDbContext podb)
        {
            if (podb == null)
                throw new ArgumentNullException("podb");

            m_db = podb;
        }
    public DBBackupHistory GetLatestBackupHistory(DBBackupFrequency backupFrequency = DBBackupFrequency.Periodic)
        {
            DBBackupHistory result = null;
            // get the backup history of the given backuptype and populate the objects 

            var configId = m_db.DBBackupConfigurations.Where(c => c.ScheduleType == (int)backupFrequency && c.BackupStatus == 1).Distinct().Select(c => c.ConfigurationId).DefaultIfEmpty(-1).First();

            if (configId > 0)
            {
                result = m_db.DBBackupHistorys.Where(b => b.Status == 1 && b.ConfigurationId == configId).OrderByDescending(lb => lb.BackupDatetime).FirstOrDefault();
            }

            return result;
        }
public IEnumerable<DBBackupConfiguration> GetAllConfiguration()
        {
            var result = m_db.DBBackupConfigurations.Where(c => c.BackupStatus == 1).OrderByDescending(c => c.ConfigurationId);

            return result;
        }
            public void Backup(DBBackupConfiguration config, int fileIndex)
        {

        Console.WriteLine("Running DB Backup type {0} to device {1}", (DBBackupType)config.BackupType, fileIndex);

            m_db.StoredProc.SPBackup(config, fileIndex);

        }

Извиквам методите по-долу в друг клас, както следва

private readonly IDataBackup m_dataBackup;
public int PerformBackup(int defaultPollIntervalInMinutes = 15)
        {
            // polling interval in Minutes
            int pollInterval = defaultPollIntervalInMinutes;

            int fileIndex = getCurrentDumpFileIndex();

            // check for the backup configuration
            var configurations = m_dataBackup.GetAllConfiguration();

            foreach (var config in configurations)
            {
    var lastBackup = m_dataBackup.GetLatestBackupHistory(DBBackupFrequency.Weekly);
                    if (lastBackup == null)
                    {
                        m_dataBackup.Backup(config, fileIndex + 1);
                        break;
                    }

Ето класа на Db Context е както по-долу

 public class MonarchDbContext:DbContext,IMonarchDbContext
        { 
               private IStoredProcedure m_storedProc;

               private static object m_dbIntializerSet;

    public MonarchDbContext(string nameOrConnectionString)
                : base( nameOrConnectionString )
            {
                //-- Set the DB initializer only once.
                System.Threading.LazyInitializer.EnsureInitialized( ref m_dbIntializerSet,()=>{
                                        Database.SetInitializer<MonarchDbContext>(null);
                        //-- Give debug builds a chance to overwrite the above.
                        _SetInitializerForDebugBuilds();
                        return new object();
                    });

                Configuration.LazyLoadingEnabled = false;
                Configuration.ProxyCreationEnabled = false;

                var csb = new SqlConnectionStringBuilder( this.Database.Connection.ConnectionString );



                csb.MultipleActiveResultSets = true;
                this.Database.Connection.ConnectionString = csb.ToString();

                var objectContext = ( this as IObjectContextAdapter ).ObjectContext;
                objectContext.CommandTimeout = 3600;
            }

       #region Public "Tables"

            public IDbSet<DBBackupConfiguration> DBBackupConfigurations { get; set; }

            public IDbSet<DBBackupHistory> DBBackupHistorys { get; set; }

            public IStoredProcedure StoredProc
            {
                get
                {

                    return System.Threading.LazyInitializer.EnsureInitialized(ref m_storedProc, () => new BackupStoredProc(this.Database));
                }
            }
            #endregion

моля, уведомете ме как мога да разреша проблема.


person AMDI    schedule 17.03.2014    source източник
comment
Това уеб приложение ли е?   -  person Tarik    schedule 17.03.2014
comment
Не, това е конзолно приложение   -  person AMDI    schedule 17.03.2014
comment
Вашето приложение многонишково ли е?   -  person Tarik    schedule 17.03.2014


Отговори (2)


Открих проблема

Трябва да добавя toList() в края на кода на Linq и току-що проработи за мен.

public IEnumerable<DBBackupConfiguration> GetAllConfiguration()
        {
        var result = m_db.DBBackupConfigurations.Where(c => c.BackupStatus == 1).OrderByDescending(c => c.ConfigurationId).ToList();
            return result;
        }
person AMDI    schedule 19.03.2014

Просто добавете списъка към Ienumerbale типове

person AMDI    schedule 18.03.2014