c# - Entity Framework 错误为“不允许新事务,因为 session 中还有其他线程正在运行

标签 c# multithreading entity-framework-5 entity-framework-4.1

我们正在使用 Entity Framework 代码优先方法 我是 Entity Framework 的新手,在尝试执行“不允许新事务,因为 session 中正在运行其他线程”时遇到错误。

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

请让我知道如何解决该问题。

最佳答案

我发现了问题

我需要在 Linq 代码末尾添加 toList(),它对我有用。

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

关于c# - Entity Framework 错误为“不允许新事务,因为 session 中还有其他线程正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22452398/

相关文章:

c - 在 gui 之外的另一个线程中运行函数

java - 给定线程对象是否可以访问 ThreadLocal 变量

c# - 不实现 System.IComparable.CompareTo(object)

c# - Caliburn.Micro:DataContext 上属性的调用方法

multithreading - Makefile目标运行并行目标,并在完成更多工作之前等待它们完成

vb.net - EF 5.0 - 无法使双向关系与 Code First 一起使用

c# - Entity Framework : creating standalone entity

c# - 将c#的datetimepicker值存储到mysql数据库中

c# - 交易范围和手动定义的交易之间的区别?

entity-framework-5 - Fluent API - 一对多