C# 无法访问已释放的对象
我正在尝试将我的一些linq代码更改为sp,但在我的一个函数中C# 无法访问已释放的对象,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我正在尝试将我的一些linq代码更改为sp,但在我的一个函数中 private async Task getNodes() { List<TreeViewNode> nodes = new List<TreeViewNode>(); var activities = await _spConnections.GetActiveListBySpAsync(User.Identity.GetCookieUserCompId<int>());
private async Task getNodes()
{
List<TreeViewNode> nodes = new List<TreeViewNode>();
var activities = await _spConnections.GetActiveListBySpAsync(User.Identity.GetCookieUserCompId<int>());
//Loop and add the Parent Nodes.
foreach (var activity in activities)
{
var model1 = await _activitiesService.GetByIdWithFormsAsync(activity.ID);
var model = model1.Forms.OrderBy(f => f.Order).ToList();
var preformid = model1.PreFormId;
nodes.Add(new TreeViewNode { id = activity.ID.ToString(), parent = "#", text = activity.Name });
var Forms = await _spConnections.GetSpMainActiveFormListAsync(activity.ID);
// Loop and add the Child Nodes.
foreach (var form in Forms)
{
DigitalContentEnum enumType = EnumHelper<DigitalContentEnum>.Parse(form.Type);
string typeName = EnumHelper<DigitalContentEnum>.GetDisplayValue(enumType);
nodes.Add(new TreeViewNode { id = form.ActivitiesID.ToString() + "-" + form.ID.ToString(), parent = form.ActivitiesID.ToString(), text = form.Title + " <span class='text-danger'>(" + typeName + ") </span> "});
}
if (preformid != null)
{
var preformtags = await _activitiesService.GetByIdWithPreFormsAsync(preformid);
var preformModel = preformtags.Forms.OrderBy(x => x.Order).ToList();
foreach (var foorm in preformModel)
{
DigitalContentEnum enumType = EnumHelper<DigitalContentEnum>.Parse(foorm.Type);
string typeName = EnumHelper<DigitalContentEnum>.GetDisplayValue(enumType);
nodes.Add(new TreeViewNode { id = foorm.ActivitiesID.ToString() + "-" + foorm.ID.ToString(), parent = model1.ID.ToString(), text = foorm.Title + " <span class='text-danger'>(" + typeName + ") </span> " });
}
}
}
//Serialize to JSON string.
var result = JsonConvert.SerializeObject(nodes);
ViewBag.Json = result;
}
错误:
无法访问已释放的对象。此错误的一个常见原因是处理通过依赖项注入解析的上下文,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文调用Dispose(),或将上下文包装到using语句中,则可能会发生这种情况。如果您使用的是依赖项注入,那么应该让依赖项注入容器处理上下文实例。
对象名称:“上下文”
出现
ActiviteService是我的存储库,它运行以下各项:
public async Task<Activity> GetByIdWithFormsAsync(long id)
{
return await _activities.Include(x => x.Forms).FirstOrDefaultAsync(x => x.ID == id);
}
公共异步任务GetByIdWithFormsAsync(长id)
{
return wait_活动。包括(x=>x.Forms).FirstOrDefaultAsync(x=>x.ID==ID);
}
我的sp是:
public async Task<List<Form>> GetSpMainActiveFormListAsync(long actId)
{
var Check = new List<Form>();
using (_unitOfWork)
{
using (var cmd = _unitOfWork.ExecuteCreateConnection())
{
cmd.CommandText = "SpGetMainActiveForm";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
var param1 = cmd.CreateParameter();
param1.ParameterName = "actId";
param1.Value = actId;
cmd.Parameters.Add(param1);
_unitOfWork.ExecuteOpenConnection();
using (var result = cmd.ExecuteReader())
{
if (result.HasRows)
{
Check = (List<Form>)CommonFunctions.Conversions.MapToList<Form>(result);
}
}
_unitOfWork.ExecuteCloseConnection();
}
}
return Check;
}
公共异步任务GetSpMainActiveFormListAsync(长actId)
{
var Check=新列表();
使用(_unitOfWork)
{
使用(var cmd=\u unitOfWork.ExecuteCreateConnection())
{
cmd.CommandText=“SpGetMainActiveForm”;
cmd.CommandType=System.Data.CommandType.StoredProcess;
var param1=cmd.CreateParameter();
param1.ParameterName=“actId”;
param1.Value=actId;
cmd.Parameters.Add(param1);
_unitOfWork.ExecuteOpenConnection();
使用(var result=cmd.ExecuteReader())
{
if(result.HasRows)
{
Check=(列表)CommonFunctions.Conversions.MapToList(结果);
}
}
_unitOfWork.ExecuteCloseConnection();
}
}
退货检查;
}
UnitOfWork是我的上下文存储库,它是
public interface IUnitOfWork:IDisposable
{
EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
void MarkAsChanged<TEntity>(TEntity entity) where TEntity : class;
DbSet<TEntity> Set<TEntity>() where TEntity : class;
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
void ExecuteSqlCommand(string query);
DbCommand ExecuteCreateConnection();
void ExecuteOpenConnection();
void ExecuteCloseConnection();
void ExecuteSqlCommand(string query, params object[] parameters);
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
}
公共接口IUnitOfWork:IDisposable
{
EntityEntry条目(TEntity实体),其中TEntity:类;
void MarkAsChanged(tenty实体),其中tenty:class;
DbSet Set(),其中tenty:class;
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
void ExecuteSqlCommand(字符串查询);
DbCommand ExecuteCreateConnection();
void ExecuteOpenConnection();
void ExecuteCloseConnection();
void ExecuteSqlCommand(字符串查询,参数对象[]参数);
任务savechangesync(bool acceptAllChangesOnSuccess,CancellationToken CancellationToken=new CancellationToken());
任务保存更改同步(CancellationToken CancellationToken=new CancellationToken());
}
我的背景是:
public class Context : DbContext, IUnitOfWork
{
public Context(DbContextOptions<Context> options)
: base(options)
{
}
public virtual DbSet<Admin> Admin { set; get; }
public virtual DbSet<Activity> Activities { set; get; }
public virtual DbSet<ActivityCategory> ActivityCategories { set; get; }
public virtual DbSet<ActivitiesPic> ActivitiesPics { set; get; }
public virtual DbSet<ActivityRecord> ActivityRecords { set; get; }
public virtual DbSet<Answer> Answers { set; get; }
public virtual DbSet<Company> Companies { set; get; }
public virtual DbSet<Form> Form { set; get; }
public virtual DbSet<NazerOrTarah> NazerOrTarah { set; get; }
//Added in 1398/12/13
public virtual DbSet<ReportDynamicTemplate> ReportDynamicTemplate { set; get; }
public virtual DbSet<ReportTemplateForms> ReportTemplateForms { set; get; }
public virtual DbSet<User> Users { set; get; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("dbo");
builder.Entity<Activity>()
.HasIndex(a => a.CompID);
builder.Entity<ActivityRecord>()
.HasIndex(a => new { a.ActivitiesID, a.NazerID });
builder.Entity<Answer>()
.HasIndex(a => new { a.ActRecordsID, a.FormID });
builder.Entity<Form>()
.HasIndex(a => new { a.ActivitiesID, a.ParentId });
// it should be placed here, otherwise it will rewrite the following settings!
foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(builder);
}
public void MarkAsChanged<TEntity>(TEntity entity) where TEntity : class
{
Update(entity);
}
public void ExecuteSqlCommand(string query)
{
Database.ExecuteSqlCommand(query);
}
public DbCommand ExecuteCreateConnection()
{
return Database.GetDbConnection().CreateCommand();
}
public void ExecuteOpenConnection()
{
Database.OpenConnection();
}
public void ExecuteCloseConnection()
{
Database.CloseConnection();
}
public void ExecuteSqlCommand(string query, params object[] parameters)
{
Database.ExecuteSqlCommand(query, parameters);
}
}
公共类上下文:DbContext,IUnitOfWork
{
公共上下文(DbContextOptions选项)
:基本(选项)
{
}
公共虚拟数据库集管理{set;get;}
公共虚拟数据库集活动{set;get;}
公共虚拟数据库集活动类别{set;get;}
公共虚拟数据库集活动pics{set;get;}
公共虚拟数据库集活动记录{set;get;}
公共虚拟数据库集回答{set;get;}
公共虚拟数据库集公司{set;get;}
公共虚拟数据库集表单{set;get;}
公共虚拟数据库集NazerOrTarah{set;get;}
//于1398/12/13年添加
公共虚拟DbSet ReportDynamicTemplate{set;get;}
公共虚拟数据库集ReportTemplateForms{set;get;}
公共虚拟数据库集用户{set;get;}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.hasdaultschema(“dbo”);
builder.Entity()
.HasIndex(a=>a.CompID);
builder.Entity()
.HasIndex(a=>new{a.ActivitiesID,a.NazerID});
builder.Entity()
.HasIndex(a=>new{a.ActRecordsID,a.FormID});
builder.Entity()
.HasIndex(a=>new{a.ActivitiesID,a.ParentId});
//它应该放在这里,否则它将重写以下设置!
foreach(builder.Model.GetEntityTypes()中的var关系。SelectMany(e=>e.GetForeignKeys())
{
relationship.DeleteBehavior=DeleteBehavior.Restrict;
}
基于模型创建(生成器);
}
public void MarkAsChanged(tenty实体),其中tenty:class
{
更新(实体);
}
public void ExecuteSqlCommand(字符串查询)
{
Database.ExecuteSqlCommand(查询);
}
public DbCommand ExecuteCreateConnection()
{
返回Database.GetDbConnection().CreateCommand();
}
public void ExecuteOpenConnection()
{
OpenConnection();
}
public void ExecuteCloseConnection()
{
CloseConnection();
}
public void ExecuteSqlCommand(字符串查询,参数对象[]参数)
{
ExecuteSqlCommand(查询、参数);
}
}
我做错了什么
public class Context : DbContext, IUnitOfWork
{
public Context(DbContextOptions<Context> options)
: base(options)
{
}
public virtual DbSet<Admin> Admin { set; get; }
public virtual DbSet<Activity> Activities { set; get; }
public virtual DbSet<ActivityCategory> ActivityCategories { set; get; }
public virtual DbSet<ActivitiesPic> ActivitiesPics { set; get; }
public virtual DbSet<ActivityRecord> ActivityRecords { set; get; }
public virtual DbSet<Answer> Answers { set; get; }
public virtual DbSet<Company> Companies { set; get; }
public virtual DbSet<Form> Form { set; get; }
public virtual DbSet<NazerOrTarah> NazerOrTarah { set; get; }
//Added in 1398/12/13
public virtual DbSet<ReportDynamicTemplate> ReportDynamicTemplate { set; get; }
public virtual DbSet<ReportTemplateForms> ReportTemplateForms { set; get; }
public virtual DbSet<User> Users { set; get; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("dbo");
builder.Entity<Activity>()
.HasIndex(a => a.CompID);
builder.Entity<ActivityRecord>()
.HasIndex(a => new { a.ActivitiesID, a.NazerID });
builder.Entity<Answer>()
.HasIndex(a => new { a.ActRecordsID, a.FormID });
builder.Entity<Form>()
.HasIndex(a => new { a.ActivitiesID, a.ParentId });
// it should be placed here, otherwise it will rewrite the following settings!
foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(builder);
}
public void MarkAsChanged<TEntity>(TEntity entity) where TEntity : class
{
Update(entity);
}
public void ExecuteSqlCommand(string query)
{
Database.ExecuteSqlCommand(query);
}
public DbCommand ExecuteCreateConnection()
{
return Database.GetDbConnection().CreateCommand();
}
public void ExecuteOpenConnection()
{
Database.OpenConnection();
}
public void ExecuteCloseConnection()
{
Database.CloseConnection();
}
public void ExecuteSqlCommand(string query, params object[] parameters)
{
Database.ExecuteSqlCommand(query, parameters);
}
}