Как внедрить зависимость ApplicationDbContext в репозиторий MVC6

Я использую Asp.Net MVC 6 beta4 с шаблоном репозитория.

В моем Startup.cs у меня есть что-то вроде этого:

services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<ApplicationDbContext>(options => 
                        options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

//Dependency Injection
services.AddTransient<IProductRepository, ProductRepository>();

В моем контроллере я могу получить свой экземпляр ApplicationDbContext с помощью:

[FromServices]
public ApplicationDbContext DbContext { get; set; }

Но я не могу получить экземпляр ApplicationDbContext в своей реализации репозитория с помощью этого кода сегмента, приведенного выше.

С MVC 5 я использовал ServiceLocator в своем репозитории и взял ApplicationDbContext так:

var context = ServiceLocator.Current.GetInstance<ApplicationDbContext>()

Как получить экземпляр ApplicationDbContext в моем репозитории с помощью Asp.NET MVC 6?


person Renatto Machado    schedule 09.07.2015    source источник
comment
Вы проверили это? stackoverflow .com/questions/29332494/   -  person Fals    schedule 09.07.2015
comment
Я приеду! Благодарить!   -  person Renatto Machado    schedule 09.07.2015
comment
Почему вы используете внедрение свойства, а не внедрение конструктора?   -  person Erik Funkenbusch    schedule 09.07.2015
comment
@ErikFunkenbusch, с инъекцией конструкции я мог бы получить экземпляр так же, как с правильной инъекцией в MVC6? Потому что с [FromServices] я получаю ApplicationDbContext в своем сеансе.   -  person Renatto Machado    schedule 09.07.2015
comment
@ErikFunkenbusch, как я это делаю?   -  person Renatto Machado    schedule 09.07.2015
comment
@RenattoMachado - я не понимаю, что вы говорите ... Какое отношение сеанс имеет к чему-либо?   -  person Erik Funkenbusch    schedule 09.07.2015
comment
Извиняюсь. Забудьте об этой части.   -  person Renatto Machado    schedule 09.07.2015


Ответы (1)


Возможно, вы захотите использовать AddScoped, а не AddTransient, чтобы контекст правильно очищался по завершении запроса.

Вам также необходимо добавить контекст, а не только вызовы AddEntityFramework...

services.AddScoped<IProductRepository, ProductRepository>();
services.AddScoped<ApplicationDbContext, ApplicationDbContext>();
person Erik Funkenbusch    schedule 09.07.2015
comment
Итак, в моем репозитории инъекции будут сделаны конструктором? - person Renatto Machado; 09.07.2015
comment
@RenattoMachado - я не понимаю, что вы имеете в виду. ., но используйте инъекцию свойств только в крайнем случае. - person Erik Funkenbusch; 09.07.2015
comment
Я сделал то, что вы сказали, но я получил эту ошибку: No data stores are configured. Configure a data store by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services. - person Renatto Machado; 09.07.2015
comment
@RenattoMachado - Вам все еще нужны вещи AddEntityFramework(...). - person Erik Funkenbusch; 09.07.2015
comment
Было бы это? services.AddEntityFramework() .AddSqlServer() .AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); Я не удалял этот код. - person Renatto Machado; 09.07.2015
comment
@RenattoMachado - хм ... эта ошибка обычно указывает, что вы не настроили DI для EF. См. github.com/aspnet/EntityFramework/issues/2156. - person Erik Funkenbusch; 09.07.2015
comment
Я решил с помощью: services.AddScoped<IdentityDbContext<ApplicationUser>, ApplicationDbContext>(); Изменить ответ, который я помечаю как решение. Большое спасибо за ваше терпение. - person Renatto Machado; 09.07.2015
comment
@RenattoMachado - Вы вводите IdentityDbContext, а не ApplicationDbContext? - person Erik Funkenbusch; 09.07.2015
comment
Давайте продолжим обсуждение в чате. - person Renatto Machado; 09.07.2015
comment
К вашему сведению, .AddDbContext<ApplicationDbContext>() регистрирует контекст как службу. .AddScoped<ApplicationDbContext>() не требуется и может быть причиной ошибки. - person bricelam; 10.07.2015