2016-08-12 1 views
0

데이터를 쿼리 할 수 ​​있도록 클래스를 만들었습니다. 내가 컨트롤러 클래스 데이터 컨텍스트에서 작동한다면,하지만 내가 만든 클래스에서 그것을 수행하면 null 오류가 발생합니다. 그것은 다음과 같은 오류가 발생합니다 : Microsoft.Extensions.DependencyInjection.Abstractions.dll을하지만, 내 시작 설정 사용자 코드 에서 처리되지 않은 :C# asp.net core. 다른 클래스의 datacontext에 액세스하는 방법

public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddApplicationInsightsTelemetry(Configuration); 

     services.AddDbContext<Abstractor_DataContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("ApplicationDatabase"))); 

     //services.AddTransient(typeof(Abstractor_DataContext)); 


     //Register your filter as a service (Note this filter need not be an attribute as such) 
     services.AddTransient<AppExceptionFilterAttribute>(); 

     services.AddMvc(); 
    } 

내 수준의 기능을

using Microsoft.Extensions.DependencyInjection; 
    public static IList<ApplicationInfo> TestDb() 
     { 
      //var options = _serviceProvider.GetService<Abstractor_DataContext>(); 
      using (var context = _serviceProvider.GetService<Abstractor_DataContext>()) 
      { 
       return context.ApplicationInfo.ToList(); 
      } 
     } 

VAR DataContext를 액세스 할 수 컨텍스트가 null입니다. 내가 뭘 놓치고 있니? DI 학습을 늦추고 있습니다.

+0

DbContext를 입력으로 사용하지 않으므로 DbContext 객체를 제공 할 수 없습니다. – skjoshi

+0

언제이 'TestDb' 메소드를 사용하고 있습니까? 이 메서드를 호출 할 때까지 데이터 컨텍스트가 등록되어 있으면 작동해야합니다. 그러나 예제에서 데이터베이스'Seed' 중에 이것을 호출하면 작동하지 않습니다. –

+0

에브라임, 나는 그것을 내 통제라고 부른다. [HttpGet] [도로 ("GetTestDb")] 공개 IList의 GetTestDb (INT 아이디) { 창 DataAccessServices.TestDb(); // _ context.ApplicationInfo.ToList(); } – inavnacorp

답변

2

새로운 DB 기반의 ASP.net 핵심 프로젝트에 대한 official documentation 당으로 먼저 당신은 당신의 모델과를 만들 DbContext 필요

using Microsoft.EntityFrameworkCore; 
using System.Collections.Generic; 

namespace EFGetStarted.AspNetCore.NewDb.Models 
{ 
    public class BloggingContext : DbContext 
    { 
     public BloggingContext(DbContextOptions<BloggingContext> options) 
      : base(options) 
     { } 

     public DbSet<Blog> Blogs { get; set; } 
     public DbSet<Post> Posts { get; set; } 
    } 

    public class Blog 
    { 
     public int BlogId { get; set; } 
     public string Url { get; set; } 

     public List<Post> Posts { get; set; } 
    } 

    public class Post 
    { 
     public int PostId { get; set; } 
     public string Title { get; set; } 
     public string Content { get; set; } 

     public int BlogId { get; set; } 
     public Blog Blog { get; set; } 
    } 
} 

그런 다음, 의존성 주입하여 상황에 맞는 등록 :

public void ConfigureServices(IServiceCollection services) 
     { 
      var connection = @"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.AspNetCore.NewDb;Trusted_Connection=True;"; 
      services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection)); 

그런 다음 데이터베이스 이주를 사용하여 데이터베이스를 작성하십시오. 이제 컨텍스트를 매개 변수 중 하나로 사용하는 생성자를 사용하여 컨트롤러를 만듭니다 (생성자 매개 변수에 BloggingContext context 참고).

using EFGetStarted.AspNetCore.NewDb.Models; 
using Microsoft.AspNetCore.Mvc; 
using System.Linq; 

namespace EFGetStarted.AspNetCore.NewDb.Controllers 
{ 
    public class BlogsController : Controller 
    { 
     private BloggingContext _context; 

     public BlogsController(BloggingContext context) 
     { 
      _context = context; 
     } 

     public IActionResult Index() 
     { 
      return View(_context.Blogs.ToList()); 
     } 

     public IActionResult Create() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public IActionResult Create(Blog blog) 
     { 
      if (ModelState.IsValid) 
      { 
       _context.Blogs.Add(blog); 
       _context.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(blog); 
     } 

    } 
} 

모든 클래스에서 DbContext를 사용하는 것은 컨트롤러에서 DbContext를 사용하는 것과 같습니다. Dependency injector에 클래스를 등록해야합니다. 방법은 ConfigureServices입니다. This page from official docs에 세부 정보가 포함되어 있습니다. 다음은 서비스 클래스 구현을 등록하는 몇 가지 예입니다.

services.AddScoped<ICharacterRepository, CharacterRepository>(); 
services.AddTransient<IOperationTransient, Operation>(); 
services.AddScoped<IOperationScoped, Operation>(); 
services.AddSingleton<IOperationSingleton, Operation>(); 
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty)); 
services.AddTransient<OperationService, OperationService>(); 
+1

OP는 컨트롤러 외부의 컨텍스트에 액세스하려고합니다. 이건 아니야. –

+0

입력에 대한 Sanju 감사. EF를 사용하여 모델을 만들었습니다. 컨트롤러 클래스의 데이터 컨텍스트에 액세스하면 모든 것이 작동하지만, 컨트롤러가 아닌 다른 클래스에서 데이터 컨텍스트를 사용하려고하면 오류가 발생합니다. 워드 프로세서를 읽는 것은 Iservice를 사용하여 dbcontext 서비스를 호출하고 Microsoft Extension DI 패키지를 추가한다고 말합니다.하지만 여전히 오류가 발생하고 컨텍스트가 null입니다. – inavnacorp

+0

컨트롤러 클래스 외부의 서비스 클래스에서 DI를 사용하여 DbContext를 사용하는 답이 업데이트되었습니다. – skjoshi

관련 문제