powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Постоянно диспозится контекст.
25 сообщений из 25, страница 1 из 1
Постоянно диспозится контекст.
    #39214293
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходные данные. CodeFirst, Autofac

До этого был Link2Sql и весь слой данных был в основном проекте.
Я все переписал на EF CodeFirst.
Теперь постоянно получаю ошибку: DBContext has been disposed

Есть класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
public class DataManager: IDataManager

	{
        private IModelDataContextWrapper _dataContext;

        public IAuditRepository Audits { get; set; }

        public ICDMRepository CDMs { get; set; }

        public ICommandRepository Commands { get; set; }

        public IMonitoringRepository Monitorings { get; set; }

        public IRoleRepository Roles { get; set; }

        public ISettingRepository Settings { get; set; }

        public IUserRepository Users { get; set; }



        public DataManager(IModelDataContextWrapper dataContext)

        {

            _dataContext = dataContext;

        }



        public IModelDataContextWrapper DataContext

        {

            get

            {

                return _dataContext;

            }

        }



        public void Dispose()

        {

            if (_dataContext != null)

            {

                _dataContext.Dispose();

                _dataContext = null;

            }



            GC.SuppressFinalize(this);

        }



        public void SaveChanges()

        {

            try

            {

                DataContext.SaveChanges();

            }

            catch (Exception ex)

            {

                string err = string.Format("exception: {0} stacktrace: {1}", ex.Message, ex.StackTrace);

                Logger.Instance.WriteLine(err);

            }

        }

    }

public class UserRepository : IUserRepository

	{

        private readonly IModelDataContext _context;

        public UserRepository(IModelDataContext context)

		{

            _context = context;

		}
       }



Что не так и как все поправить?
Autofac регистрация:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
var builder = new ContainerBuilder();

            builder.RegisterControllers(Assembly.GetExecutingAssembly());



            builder.RegisterType<ModelDataContext>().As<IModelDataContext>().InstancePerHttpRequest();

            builder.RegisterType<ModelDataContextWrapper>().As<IModelDataContextWrapper>().InstancePerHttpRequest();

            builder.RegisterType<ArchiveModelDataContext>().As<IArchiveModelDataContext>().InstancePerHttpRequest();



            builder.RegisterType<DataManager>().As<IDataManager>().PropertiesAutowired().InstancePerHttpRequest();



            builder.RegisterType<AuditRepository>().As<IAuditRepository>().InstancePerHttpRequest();

            builder.RegisterType<CommandRepository>().As<ICommandRepository>().InstancePerHttpRequest();

            builder.RegisterType<CDMRepository>().As<ICDMRepository>().InstancePerHttpRequest();

            builder.RegisterType<MonitoringRepository>().As<IMonitoringRepository>().InstancePerHttpRequest();

            builder.RegisterType<RoleRepository>().As<IRoleRepository>().InstancePerHttpRequest();

            builder.RegisterType<SettingRepository>().As<ISettingRepository>().InstancePerHttpRequest();

            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerHttpRequest();

            builder.RegisterType<ThemedViewEngine>();

            builder.RegisterFilterProvider();

            IContainer container = builder.Build();

            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));



            var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>();

            lifetimeScope.InjectProperties(Membership.Provider);

            lifetimeScope.InjectProperties(Roles.Provider);
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214375
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрать Dispose из DataManager. За время жизни контекста у тебя отвечает Autofac через регистрацию InstancePerHttpRequest.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214453
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Не помогло. Советуют не инжектить контекст в репо, а там его создавать каждый раз в каждом методе.

Типа:
Код: c#
1.
2.
3.
using(DataContext context = new DataContext())
{
}
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214468
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНе помогло.Значит показал не все особенности своего кода. Вероятно ещё какие-то сервисы сами "диспозят" свои зависимости.

PavluhaСоветуют не инжектить контекст в репо, а там его создавать каждый раз в каждом методе.

Типа:
Код: c#
1.
2.
3.
using(DataContext context = new DataContext())
{
}

Такой подход имеет свои недостатки.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214484
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Я немного поменял автофак на такое:
А больше ничего. Dispose убрал
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var builder = new ContainerBuilder();
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            builder.RegisterType<ModelDataContext>().As<IModelDataContext>().InstancePerLifetimeScope();
            builder.RegisterType<ModelDataContextWrapper>().As<IModelDataContextWrapper>().InstancePerLifetimeScope();
            builder.RegisterType<ArchiveModelDataContext>().As<IArchiveModelDataContext>().InstancePerLifetimeScope();

            builder.RegisterType<DataManager>().As<IDataManager>().PropertiesAutowired().InstancePerLifetimeScope();

            builder.RegisterType<AuditRepository>().As<IAuditRepository>().InstancePerLifetimeScope();
            builder.RegisterType<CommandRepository>().As<ICommandRepository>().InstancePerLifetimeScope();
            builder.RegisterType<CDMRepository>().As<ICDMRepository>().InstancePerLifetimeScope();
            builder.RegisterType<MonitoringRepository>().As<IMonitoringRepository>().InstancePerLifetimeScope();
            builder.RegisterType<RoleRepository>().As<IRoleRepository>().InstancePerLifetimeScope();
            builder.RegisterType<SettingRepository>().As<ISettingRepository>().InstancePerLifetimeScope();
            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214501
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>();
            lifetimeScope.InjectProperties(Membership.Provider);
            lifetimeScope.InjectProperties(Roles.Provider);


Может из-за этого? Membership.Provider и Roles.Provider используют DataContext?
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214509
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaАлексей К,

Не помогло. Советуют не инжектить контекст в репо, а там его создавать каждый раз в каждом методе.

Типа:
Код: c#
1.
2.
3.
using(DataContext context = new DataContext())
{
}



плохой совет. несколько репо в одном сервисе не получится нормально использовать
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214517
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегонщик перекупкиPavluhaАлексей К,

Не помогло. Советуют не инжектить контекст в репо, а там его создавать каждый раз в каждом методе.

Типа:
Код: c#
1.
2.
3.
using(DataContext context = new DataContext())
{
}




плохой совет. несколько репо в одном сервисе не получится нормально использовать
Наоборот, это правильный совет.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214518
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Провайдера работают через репо
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
internal class UserProvider : MembershipProvider
    {
        public IUserRepository Users { get; set; }
}

internal class RoleProvider : System.Web.Security.RoleProvider
	{
        public IRoleRepository Roles { get; set; }
}



Это может повлиять как-то?

Дело в том, что ошибка возникает, в момент доступа через IDataManager
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214520
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перегонщик перекупки,

Т.е. стоит убрать IDataManager и непосредственно инжектить нужные репо в контроллеры?
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214523
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronПерегонщик перекупкипропущено...


плохой совет. несколько репо в одном сервисе не получится нормально использовать
Наоборот, это правильный совет.Так не бывает. Всё имеет свои преимущества и недостатки.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214530
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaАлексей К,

Провайдера работают через репо
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
internal class UserProvider : MembershipProvider
    {
        public IUserRepository Users { get; set; }
}

internal class RoleProvider : System.Web.Security.RoleProvider
	{
        public IRoleRepository Roles { get; set; }
}



Это может повлиять как-то?

Дело в том, что ошибка возникает, в момент доступа через IDataManagerКакое время жизни у UserProvider? Он синглетон? Сравни его время жизни с временем жизни области, из которой ты в него инжектишь свойства.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214531
Перегонщик перекупки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaПерегонщик перекупки,

Т.е. стоит убрать IDataManager и непосредственно инжектить нужные репо в контроллеры?


IDataManager - по внешнему виду напоминает сервис (там не место дбконтекст). вот такие сервисы и надо инжектить в контроллеры. а дбконтекст инжектить в репо. а временем жизни дбконтекст пусть управляет IоC.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214532
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегонщик перекупкиPavluhaАлексей К,

Не помогло. Советуют не инжектить контекст в репо, а там его создавать каждый раз в каждом методе.

Типа:
Код: c#
1.
2.
3.
using(DataContext context = new DataContext())
{
}



плохой совет. несколько репо в одном сервисе не получится нормально использоватьДа: нежелательные распределённые транзакции, невозможность комбинировать запросы и прочие неприятности. Но если речь идёт о чём-то простом, то почему бы и нет.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214544
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Нет, не синглтон. Это реализация кастомного провайдера для ролей и пользователей.
Про время жизни ХЗ. Нигде не задавал
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214548
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перегонщик перекупки,

Это реализация UnitOfWork, поэтому там и контекст.
Могу убрать, но боюсь это не поможет. Сейчас проверю
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214558
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал контекст и DataManager-а, все по прежнему
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214648
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaАлексей К,

Нет, не синглтон. Это реализация кастомного провайдера для ролей и пользователей.
Про время жизни ХЗ. Нигде не задавалЯ бы начал с этого, если "ручной" Dispose зависимостей везде убран.
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214663
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Каким способом это поможет, если в провайдеры инъектится репо, как свойство, которое никак не связано, с объектами в DataManager
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39214796
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaАлексей К,

Каким способом это поможет, если в провайдеры инъектится репо, как свойство, которое никак не связано, с объектами в DataManagerНу тогда пора перейти от гаданий к работе с отладчиком, просмотру StackTrace в исключении и прочим способам диагностики ошибок. :-)
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39215006
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPavluhaАлексей К,

Каким способом это поможет, если в провайдеры инъектится репо, как свойство, которое никак не связано, с объектами в DataManagerНу тогда пора перейти от гаданий к работе с отладчиком, просмотру StackTrace в исключении и прочим способам диагностики ошибок. :-)

может поможет: логировать ID дбсессии
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39215141
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

вы были правы. Трабла была с синглтоном.
Отсюда вопрос, как тогда с ним работать

Было так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
ISettingRepository _settings;
        protected SettingSingleton()
        {
            _settings = new SettingRepository(new ModelDataContext());
        }


        private sealed class SingletonCreator
        {
            private static readonly SettingSingleton _instance = new SettingSingleton();
            public static SettingSingleton Instance { get { return _instance; } }
        }

        private Setting GetPropertyByName(string name)
        {
            return _settings.GetProperty(name);
        }
        ......................



Я переделал на такое
Код: c#
1.
2.
3.
4.
5.
private Setting GetPropertyByName(string name)
        {
            _settings = DependencyResolver.Current.GetService<ISettingRepository>();
            return _settings.GetProperty(name);
        }



Или вообще синглтон убирать?
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39215142
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного перепутал.
Было так:

Код: c#
1.
2.
3.
4.
protected SettingSingleton()
        {
            _settings = DependencyResolver.Current.GetService<ISettingRepository>();
        }
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39215181
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaЯ переделал на такое
Код: c#
1.
2.
3.
4.
5.
        private Setting GetPropertyByName(string name)
        {
            _settings = DependencyResolver.Current.GetService<ISettingRepository>();
            return _settings.GetProperty(name);
        }

Вероятно лучше так, через локальную переменную:
Код: c#
1.
2.
3.
4.
5.
        private Setting GetPropertyByName(string name)
        {
            var settings = DependencyResolver.Current.GetService<ISettingRepository>();
            return settings.GetProperty(name);
        }


PavluhaИли вообще синглтон убирать?Ну оцени все плюсы и минусы синглетона в твоей ситуации. Я бы убрал или, если он действительно нужен в одном экземпляре, создавал бы его контейнером с помощью регистрации Single Instance .
...
Рейтинг: 0 / 0
Постоянно диспозится контекст.
    #39216085
Иммануил Кант
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в контексте веба, синглитоны - только на запрос. самое простое - через IoC
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Постоянно диспозится контекст.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]