gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:32 25 4
gpt4 key购买 nike

我们正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com