既存のデータベースを持つEntity Framework 7 .Net 5 MVC 6

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

質問

こんにちは私はエンティティフレームワーク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; }
}

2つの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();
    }
}

ユーザー/インデックスページに移動すると、リスト行に次のエラーが表示され続けます。

$ exception {"オブジェクト参照がオブジェクトのインスタンスに設定されていません。"} System.NullReferenceException

何らかの理由で、データベースから情報を引き出していません。 Microsoft SQLServer 2014で作成します。また、ユーザー表にデータがあります。ステップがないか、間違った方法でデータにアクセスしようとしていますか?

受け入れられた回答

主な問題は、

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

の代わりに

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

使用することは可能です

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

1つはコンストラクタpublic UsersController(DatabaseContext context)削除する必要がありpublic UsersController(DatabaseContext context) 。最後の方法は推奨されません。なぜなら、RC2は第2の方法を落としたからです。 発表を参照してください。

上記の変更により、最初の問題は修正されますが、 UsersテーブルとCustomersテーブルのUpdatedフィールドにはNULL値が含まれているため、使用するデータベースとテストデータにもう1つの問題が生じます。したがって、あなたは使用する必要があります

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 )と同じディレクトリで実行できます。私は、より良い読書のために新しい行にコマンドの一部をラップしました。 1つはすべての原因の1つの行に配置する必要があります。上記のコマンドは、 [Table("Users")]User[Table("Customers")]Customer代わりにUsersクラスとCustomersクラスを作成しますが、コードを基本として使用し、後で必要な変更をすべて手動で行うことができます。

UPDATED:次のコマンドは足場クラスの生成に適しているようです。

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すべてのデータベーステーブルに1つのファイルと一つの追加のファイル:ファイルDemoContext.cs 、クラスが含まれDemoContext由来DbContextDemo使用するデータベースの名前です)。あなたは削除する必要がありOnConfiguringから機能をDemoContext.csを経由して接続文字列を設定できるようにするには

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

メインプロジェクトJenSolo Startup.csConfigureServicesあります。

更新: .NET Core RC2以降、 dnx ef dbcontext scaffoldではなくdnx ef dbcontext scaffoldを使用する必要があります。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ