質問

Asp.Net Core RC2とEF Coreを利用したWebアプリケーションを作成しています。自動インクリメントのプライマリキーを持つSQLiteデータベースに新しい行を挿入しようとすると、この挿入を実行しようとするとすべてエラーが発生します。

Microsoft.EntityFrameworkCore.dllで 'System.InvalidOperationException'タイプの例外が発生しましたが、ユーザーコードで処理されませんでした

追加情報:「SystemIssue」タイプのエンティティを作成または追跡することができません。これは、主キー値または代替キー値がNULLであるためです。

フィールド "id"に手動で値を追加すると、挿入が正しく機能します。

SQL

CREATE TABLE "SystemIssues" 
(
    `Id`    INTEGER PRIMARY KEY,
    `TicketNumber`  TEXT,
    `HostName`  TEXT NOT NULL,
    `CreateDate`    TEXT,
    `EndDate`   TEXT,
    `Details`   TEXT,
    `IsClosed`  INTEGER
)

モデル

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace psiWebApp.Models
{
    public class SystemIssue
    {
        public string Id { get; set; }

        public string HostName { get; set; }
        public string TicketNumber { get; set; }

        public string CreateDate { get; set; }
        public string EndDate { get; set; }
        public string Details { get; set; }
        public int isClosed { get; set; }
    }
}

コントローラ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using psiWebApp.Models;
using System.Data;

// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860

namespace psiWebApp.Controllers
{
    public class SystemIssueController : Controller
    {
        private MyDbContext _dbcontext;

        public SystemIssueController(MyDbContext context)
        {
            _dbcontext = context;
        }

        // GET: /<controller>/
        public IActionResult Index()
        {
            var openTickets = from g in _dbcontext.SystemIssues where g.isClosed !=0 orderby g.Id select g;
            return View(openTickets.ToList());
           // return View(_dbcontext.SystemIssues.ToList());
        }

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

        //
        // POST: /SystemIssue/Add

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Add(SystemIssue systemissue)
        {
            //if (ModelState.IsValid)
            {
                // _dbcontext.Entry(systemissue).State = Microsoft.EntityFrameworkCore.EntityState.Added;
                //systemissue.Id = "6";

                systemissue.TicketNumber = "8888";
                systemissue.isClosed = 1;
                systemissue.Details = "Test Data for this host 888";
                systemissue.HostName = "server.host1";
                systemissue.CreateDate = "06/24/2016";
                // systemissue.EndDate = "06/24/2016";
                //systemissue.Id = null;
                _dbcontext.SystemIssues.Add(systemissue);
                _dbcontext.SaveChanges();
                return RedirectToAction("Index");
            }
        }
    }
}

MyDbContext

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Data.Common;
using psiWebApp.Models;
using Microsoft.EntityFrameworkCore;

namespace psiWebApp.Models
{
    public class  MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options) 
            : base(options)
        { }

        public DbSet<Contact> Contacts { get; set; }
        public DbSet<SystemIssue> SystemIssues { get; set; }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            builder.Entity<SystemIssue>().HasKey(m => m.Id);
            base.OnModelCreating(builder);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Filename=./psiweb.db");
        }
    }
}

Startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.EntityFrameworkCore;
using psiWebApp.Models;
using Microsoft.Extensions.PlatformAbstractions;

namespace psiWebApp
{
    public class Startup
    {
        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)
                .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.AddMvc();
            var path = PlatformServices.Default.Application.ApplicationBasePath;
            services.AddEntityFrameworkSqlite().AddDbContext<MyDbContext>(optionsBuilder => optionsBuilder.UseSqlite("Filename=./psiweb.db"));

        }

        // 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();
            //loggerFactory.AddProvider(new MyFilteredLoggerProvider());

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

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

                routes.MapRoute(
                    name: "SystemIssues",
                    template: "{controller=SystemIssues}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "Dashboard",
                    template: "{controller=Dashboard}/{action=Index}");
            });
        }
    }
}

受け入れられた回答

あなたのdbスクリプトはIdを整数として定義しているので、モデル上で整数でなければなりません


人気のある回答

モデルはintでなければならないとき、文字列として定義されたidを持っています。



Related

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