Я пытаюсь изменить некоторые из моих кодов linq на sp, но в одной из моих функций
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;
}
Итак, как вы видите, действия var заполняются путем запуска sp, и он работает, но когда он достигает
var model1 = await _activitiesService.GetByIdWithFormsAsync(activity.ID);
Ошибка:
Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен с помощью внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose () в контексте или заключаете контекст в оператор using. Если вы используете внедрение зависимостей, вы должны позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста. Имя объекта: 'Контекст'.
появляется
activitesservice - это мой репозиторий, в котором выполняется следующее:
public async Task<Activity> GetByIdWithFormsAsync(long id)
{
return await _activities.Include(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;
}
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());
}
, а мой контекст:
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);
}
}
Что я делаю не так?