2017-02-22 80 views
1

Я пытаюсь создать API с использованием ядра .net, я создаю Entity «Пользователь», DbContext, Repository и Controller, чтобы проверить, работает ли он, но когда я тестирую его с помощью Postman, я получаю всегда 500 Http statu, указывающий на ошибку межсетевого сервера. Вот моя сущность:Подключиться к базе данных .net core

public class User 


     { 
      [Key] 
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
      public long Id { get; set; } 
      [Required] 
      public string UserName { get; set; } 
      public string Email { get; set; } 
      [Required] 
      public string Password { get; set; } 
      public ICollection<Post> Posts { get; set; } = new List<Post>(); 
     } 

здесь й DbContext:

public class NetworkDbContext : DbContext 
    { 
     public NetworkDbContext(DbContextOptions options) : base(options) 
     { 
      Database.EnsureCreated(); 
     } 
     public DbSet<User> Users { get; set; } 
     public DbSet<Post> Posts { get; set; } 
     public DbSet<Comment> Comments { get; set; } 
    } 

здесь является Repository:

public class UserRepository : IUserRepository 
    { 
     private readonly NetworkDbContext _context; 
     public UserRepository(NetworkDbContext context) 
     { 
      _context = context; 
     } 
     public void AddUser(User user) 
     { 
      _context.Users.Add(user); 
      _context.SaveChanges(); 
     } 

     public IEnumerable<User> GetAllUsers() 
     { 
      return _context.Users.ToList(); 
     } 

     public void RemoveUser(User user) 
     { 
      _context.Users.Remove(user); 
      _context.SaveChanges(); 
     } 

     public void Update(User user) 
     { 
      _context.Users.Update(user); 
      _context.SaveChanges(); 
     } 
    } 

В startup.cs:

public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

      if (env.IsEnvironment("Development")) 
      { 
       // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately. 
       builder.AddApplicationInsightsSettings(developerMode: true); 
      } 

      builder.AddEnvironmentVariables(); 
      Configuration = builder.Build(); 
     } 

     public IConfigurationRoot Configuration { get; } 

     // This method gets called by the runtime. Use this method to add services to the container 
     public void ConfigureServices(IServiceCollection services) 
     { 
      // Add framework services. 
      services.AddApplicationInsightsTelemetry(Configuration); 

      services.AddMvc(); 
      var connectionString = Configuration["connectionString"]; //connection string to sqlServer 
      services.AddDbContext<NetworkDbContext>(o => o.UseSqlServer(connectionString)); 
      services.AddScoped<IUserRepository, UserRepository>(); 
     } 

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline 
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
      loggerFactory.AddDebug(); 

      app.UseApplicationInsightsRequestTelemetry(); 

      app.UseApplicationInsightsExceptionTelemetry(); 

      app.UseMvc(); 
     } 
    } 

и наконец, вот мой Co ntroller:

[Route("api/user")] 
    public class UserController : Controller 
    { 
     private UserRepository _repository { get; set; } 
     public UserController(UserRepository repository) 
     { 
      _repository = repository; 
     } 
     [HttpPost] 
     public void AddUser([FromBody] User user) 
     { 
      if (user == null) 
     { 
      return BadRequest(); 
     } 
     _repository.AddUser(user); 
     return CreatedAtRoute("GetUser", user); 
     } 

    } 

На самом деле это означает, в диагностическом инструменте исключение: «System.InvalidOperationException», не в силах разрешить услугу типа «SocilNetworkApi.Models.UserRepository».

ответ

1

Проблема не связана с EF, но это зависимость от контроллера

контроллер в зависимости от UserRepository поэтому во время выполнения пытается решить этот тип, но это не отображается. Вот почему это дает вам эту ошибку.

Вы должны сделать свой контроллер в зависимости от IUserRepository не на UserRepository

[Route("api/user")] 
public class UserController : Controller 
{ 
    private IUserRepository _repository { get; set; } 
    public UserController(IUserRepository repository) 
    { 
     _repository = repository; 
    } 
} 

Это должно решить проблему.

+0

спасибо, что это работает –

0

«SocilNetworkApi.Models.UserRepository» необходимо зарегистрировать в контейнере инъекции зависимостей, чтобы он был введен в конструктор UserController.

+0

но это сделано alredy –

+0

Извините, я пропустил это, я нахожусь на мобильном телефоне. Вам нужно ввести интерфейс не конкретный класс. –