Identity INSERT имеет значение OFF-Visual Studio
Я пытаюсь вставить значения в таблицу в локальной базе данных. Я использую для этого 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)
);
Как устранить эту ошибку? Любая помощь будет оцененный.
3 ответа:
Поскольку вы используете Entity Framework, вы должны использовать модель данных. После перетаскивания таблицы в модель просто Щелкните правой кнопкой мыши на Id, хранящемся в модели, и из набора свойств StoreGeneratedPattern в identity и сохраните. Проверьте еще раз после сохранения, и это может решить вашу проблему. Но если вы используете код первого подхода, этот метод недопустим.
, который выглядит как Sql Server, а не MySql (MySql имеет столбцы
AUTO_GENERATED
, Sql Server имеет столбцыIdentity
).В любом случае, ваше свойство Entity PK
PUserDataTable.ID
должно быть помечено:public class PUserDataTable { [DatabaseGenerated(DatabaseGenerationOption.Identity)] public int ID {get; set;}
, или если вы используете fluent api, используйте
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Это остановит попытки EF вставить столбец.
Предполагая, что ваш класс PUserDataTable имеет внутреннюю структуру, подобную этой:
public class PUserDataTable { public int Id {get;set;} //other properties }
Вы должны добавить этот атрибут
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
, и это должно решить проблему.Этот атрибут предупреждает EF, что база данных уже генерирует значение для этого свойства / столбца и не нужно беспокоиться об этом, иначе EF, похоже, генерирует значение для полей с примитивными типами. В случае int это 0.