我试图将值插入到本地数据库的表中。我为此使用了EntityFramework。 我的代码非常简单直接,但是当我尝试将数据插入表格时,我收到了这个错误。
Cannot insert explicit value for identity column in table 'PUserDataTable' when IDENTITY_INSERT is set to OFF.
更新: 我现在使用以下代码收到此错误。
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace SampleDatabase.Controllers
{
public class PUserDataTableController : Controller
{
PUserDataTableContext db = new PUserDataTableContext();
public ActionResult Index()
{
return View(db.PUserDataTables.ToList());
}
[HttpGet]
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(PUserDataTable userdata)
{
if(ModelState.IsValid)
{
db.PUserDataTables.Add(userdata);
try
{
db.SaveChanges();
return RedirectToAction("Index");
}
catch (DbEntityValidationException e)
{
foreach (var eve in e.EntityValidationErrors)
{
Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
eve.Entry.Entity.GetType().Name, eve.Entry.State);
foreach (var ve in eve.ValidationErrors)
{
Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
ve.PropertyName, ve.ErrorMessage);
}
}
throw;
}
}
return View(userdata);
}
}
}
这是我的模特:
namespace SampleDatabase
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
public partial class PUserDataTable
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Nullable<int> Id { get; set; }
public string DeviceID { get; set; }
public string TimeSpent { get; set; }
public Nullable<int> NumPages { get; set; }
public string History { get; set; }
public string FinalPage { get; set; }
}
}
以下是我创建表格的方法。
CREATE TABLE [dbo].[PUserDataTable] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[DeviceID] VARCHAR (50) NULL,
[TimeSpent] VARCHAR (50) NULL,
[NumPages] INT NULL,
[History] VARCHAR (MAX) NULL,
[FinalPage] VARCHAR (50) NULL,
CONSTRAINT [PK_PUserDataTable] PRIMARY KEY CLUSTERED ([Id] ASC)
);
如何解决此错误?任何帮助将不胜感激。
答案 0 :(得分:6)
由于您使用的是Entity Framework,因此您必须使用数据模型。将表格拖放到模型中后,只需右键单击在模型上的 ID ,并将属性设置 StoreGeneratedPattern 转换为身份< / strong>并保存。保存后再次检查,它可能会解决您的问题。但是如果你使用代码第一种方法,这种方法无效。
答案 1 :(得分:4)
看起来像Sql Server,而不是MySql(MySql有AUTO_GENERATED
列,Sql Server有Identity
)。
无论哪种方式,您的实体PK属性PUserDataTable.ID
都应标记为:
public class PUserDataTable
{
[DatabaseGenerated(DatabaseGenerationOption.Identity)]
public int ID {get; set;}
,或者如果您使用的是流畅的api,请使用
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
这将阻止EF尝试插入列。
答案 2 :(得分:1)
假设您的PUserDataTable类具有如下内部结构:
public class PUserDataTable {
public int Id {get;set;}
//other properties
}
您应该添加此属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
,这应该可以解决问题。
此属性警告EF,数据库已经为此属性/列生成了值,无需担心,否则EF似乎会为具有基本类型的字段生成值。在int的情况下,它是0。