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 2

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.