【问题标题】:IDENTITY_INSERT is set to OFF - Visual StudioIDENTITY_INSERT 设置为 OFF - Visual Studio
【发布时间】:2014-12-18 07:32:42
【问题描述】:

我正在尝试将值插入到本地数据库的表中。我为此使用了 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)
);

如何解决此错误?任何帮助将不胜感激。

【问题讨论】:

  • IDENTITY_INSERT 的默认设置是关闭的,这是有充分理由的。标识列旨在由数据库填充,而不是由调用者填充。除非 MySQL EF 提供程序存在问题,否则 EF 应该可以很好地处理这个问题。您可以发布该表的 EF 数据模型的代码吗?
  • 这正是我的问题。我没有强制将任何数据添加到“Id”字段中,但它仍在抱怨。
  • 你有没有用调试器进入代码,看看userdata在碰到控制器时包含什么?
  • 'userdata' 对象还包含一个设置为 0 的 'Id' 字段,试图插入到表中。这很奇怪,因为我没有在“Id”字段中添加任何内容。有没有办法告诉程序忽略“Id”字段,因为它应该随着每次插入方法调用自动递增。
  • int 的默认值为 0,因此即使您没有明确地为它分配值,它仍然有一个 (0)。

标签: c# asp.net-mvc database entity-framework visual-studio-2012


【解决方案1】:

由于您使用的是实体框架,因此您必须使用数据模型。将表格拖放到模型中后,只需在模型上的 Id 字段上右键单击,然后从属性集 StoreGeneratedPatternidentity 并保存。保存后再次检查,它可能会解决您的问题。但是,如果您使用代码优先方法,则此方法无效。

【讨论】:

  • thanx dam 也帮助了我
  • 这个答案对我有帮助
【解决方案2】:

这看起来像 Sql Server,而不是 MySql(MySql 有 AUTO_GENERATED 列,Sql Server 有 Identity)。

无论哪种方式,您的实体 PK 属性 PUserDataTable.ID 都应标记为:

public class PUserDataTable
{
   [DatabaseGenerated(DatabaseGenerationOption.Identity)]
   public int ID {get; set;}

,或者如果您使用的是 fluent api,请使用

.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

这将阻止 EF 尝试插入列。

【讨论】:

  • 我在模型中的“Id”字段之后添加了 [DatabaseGenerated(DatabaseGenerationOption.Identity)]。但是,我仍然遇到同样的错误。
  • 我更新了我的代码,清理了项目并再次尝试,仍然得到同样的错误。我尝试调试程序,当它尝试调用“SaveChanges()”方法时,我的“userdata”对象还包含一个设置为 0 的“Id”字段。
  • 如果您首先使用数据库或模型,还要检查您是否没有在 EDMX 设计器中切换StoreGeneratedPattern
  • 将 Id 定义更改为 Nullable 解决了该问题,但现在我收到“一个或多个实体的验证失败。有关更多详细信息,请参阅 'EntityValidationErrors' 属性。”错误。我更新了我的问题并包含了可能导致此错误的新代码。
【解决方案3】:

假设您的 PUserDataTable 类具有这样的内部结构:

public class PUserDataTable {
   public int Id {get;set;}
   //other properties
}

你应该添加这个属性[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 应该可以解决问题。

此属性警告 EF 数据库已经在为此属性/列生成值,无需担心,否则 EF 似乎会为具有原始类型的字段生成值。在 int 的情况下为 0。

【讨论】:

  • 我添加了属性,但仍然得到同样的错误。
  • 让你的属性是 int?(或 Nullable),而不仅仅是 int。我相信这会解决问题。
  • 我同意 EF 有很多东西需要考虑修改。
  • 这解决了问题,但现在我收到错误“一个或多个实体的验证失败。有关更多详细信息,请参阅 'EntityValidationErrors' 属性。”。我更新了我的问题并添加了更多可能与此错误相关的代码。
  • 您是否设置了任何验证规则?
猜你喜欢
  • 2013-06-09
  • 1970-01-01
  • 2021-08-27
  • 2015-10-18
  • 2011-10-02
  • 2018-05-27
  • 2012-04-24
  • 2010-10-01
  • 2011-03-07
相关资源
最近更新 更多