Entity Framework 7 .Net 5 MVC 6의 기존 데이터베이스 포함

asp.net-core-mvc c# entity-framework-core

문제

안녕하세요, 저는 Entity Framework 7 MVC 6을 사용하여 기존 데이터베이스에서 데이터를 가져 오는 데 문제가 있습니다. ( 여기에 프로젝트 코드를 게시했습니다.) 적절한 연결 문자열을 사용하여 appsettings.json을 설정했습니다.

"Data": {
    "DefaultConnection": {
        "ConnectionString": "Data Source=localhost;Initial Catalog=Demo;Integrated Security=True"
}

내 사용자 정의 컨텍스트가 있습니다.

public class DatabaseContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }
}

두 Poco 클래스 :

[Table("Customers")]
public class Customer
{
    [Key]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string EmailAddress { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }
    public User User { get; set; }
    public bool Active { get; set; }
}

[Table("Users")]
public class User
{
    [Key]
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string EmailAddress { get; set; }
    public DateTime Created { get; set; }
    public DateTime Updated { get; set; }
    public bool Active { get; set; }
}

그리고 startup.cs에서 서비스를 설정하고 있습니다.

public Startup(IHostingEnvironment env)
    {
        // Set up configuration sources.

        var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

        if (env.IsDevelopment())
        {
            // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
            builder.AddUserSecrets();

            // 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; set; }

    // 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.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<DatabaseContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();

        services.AddMvc();

        // Add application services.

    }

    // 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();

        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");

            // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
            try
            {
                using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                    .CreateScope())
                {
                    serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
                         .Database.Migrate();
                }
            }
            catch { }
        }

        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());

        app.UseApplicationInsightsExceptionTelemetry();

        app.UseStaticFiles();

        app.UseIdentity();

        // To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

    // Entry point for the application.
    public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}

내 사용자 컨트롤러 :

[Route("[controller]")]
public class UsersController : Controller
{
    public DatabaseContext _context { get; set; }

    public UsersController(DatabaseContext context)
    {
        _context = context;
    }
    [Route("[action]")]
    public IActionResult Index()
    {
        using (_context)
        {
            List<User> users = _context.Users.ToList();
        }


        return View();
    }
}

사용자 / 색인 페이지로 이동하면 목록 줄에서 다음 오류가 계속 발생합니다.

$ 예외 { "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."} System.NullReferenceException

어떤 이유로 데이터베이스에서 정보를 가져 오지 않습니다. Microsoft SQLServer 2014에서 만듭니다. 그리고 사용자 테이블에 데이터가 있습니다. 단계가 누락되었거나 잘못된 방식으로 데이터에 액세스하려고합니까?

수락 된 답변

주요 문제는 다음을 사용하여 해결할 수 있습니다.

public UsersController([FromServices] DatabaseContext context)
{
    _context = context;
}

대신에

public UsersController(DatabaseContext context)
{
    _context = context;
}

사용할 수 있습니다.

[FromServices]
public DatabaseContext _context { get; set; }

하지만 하나는 생성자 public UsersController(DatabaseContext context)제거 해야합니다. 마지막 방법은 권장되지 않습니다. 왜냐하면 RC2가 두 번째 방법을 버렸기 때문입니다. 발표를 참조하십시오.

위의 변경 사항은 사용자가 가지고있는 첫 번째 문제점을 수정하지만 UsersCustomers 테이블의 Updated 필드에 NULL 값이 포함되어 있기 때문에 사용하는 데이터베이스와 테스트 데이터에 문제가 하나 더 NULL . 따라서 당신은

public DateTime? Updated { get; set; }

대신에

public DateTime Updated { get; set; }

내가 추천 할 방법은 추천서의 사용법이다.

dnx ef dbcontext scaffold
    "Data Source=localhost;Initial Catalog=Demo;Integrated Security=True"
    EntityFramework.MicrosoftSqlServer --outputDir ..\Bestro\Model --verbose

이는 주 project.json이있는 디렉토리 ( src\JenSolo )에서 실행할 수 있습니다. 나는 더 나은 독서를 위해 명령의 일부를 줄 바꿈했다. 하나는 모든 원인을 하나로 묶어야합니다. 위의 명령은 [Table("Users")]User[Table("Customers")]Customer 대신 UsersCustomers 클래스를 만들지 만이 코드를 기초로 사용하고 나중에 모든 필요한 수정을 수동으로 수행 할 수 있습니다.

업데이트 됨 : 다음 명령은 스캐 폴드 클래스를 생성하는 데 더 적합합니다.

dnx ef dbcontext scaffold
    "Data Source=localhost;Initial Catalog=Demo;Integrated Security=True"
    EntityFramework.MicrosoftSqlServer --outputDir ..\Bestro\Model --verbose
    --targetProject Bestro --dataAnnotations

JenSolo 프로젝트의 Class Library Bestro를 사용하기 때문입니다. ...\src\JenSolo 폴더를 현재 디렉토리로 사용하여 명령 행에서 위의 명령을 실행해야합니다. 클래스 라이브러리 프로젝트 (Bestro)에 Model 폴더가 생성됩니다. Model 폴더 의지는 많은 포함 *.cs 모든 데이터베이스 테이블에 대한 하나 개의 파일과 하나의 추가 파일 : 파일 DemoContext.cs 의 클래스가 포함되어 DemoContext 에서 파생 된 DbContext ( Demo 사용하는 데이터베이스의 이름입니다). DemoContext.cs 에서 OnConfiguring 함수를 제거하여 다음을 통해 연결 문자열을 구성 할 수 있어야합니다.

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

주요 프로젝트 JenSoloStartup.csConfigureServices 에 있습니다.

업데이트 : .NET Core RC2부터 dnx ef dbcontext scaffold 대신 dnx ef dbcontext scaffold 합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.