저는 Asp.Net Core RC2 및 EF Core를 사용하는 웹 응용 프로그램을 작성하고 있습니다. 나는 자동 증분 기본 키를 가지고 있어야 SQLite 데이터베이스에 새 행을 삽입 할 때, 모든 시도는 오류이 삽입 결과를 수행 할 수기본 키가 삽입되지 않았습니다.
An exception of type 'System.InvalidOperationException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code
Additional information: Unable to create or track an entity of type 'SystemIssue' because it has a null primary or alternate key value.
내가 수동으로 "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}");
});
}
}
}
수동으로 테이블을 생성 하시겠습니까? – mvermef
@mvermef 문제가 발견되어 실수로 눈을 뗄 수없는 두 번째 눈이 듭니다. 모델의 필드 ID는 int이어야 할 때 문자열로 정의됩니다. – Gearbolt
제목에 태그를 넣지 마십시오. – Tseng