当IDENTITY_INSERT设置为OFF时,无法为表'ClientDetails'中的标识列插入显式值。

12

每当我尝试通过表单向这个数据库提交数据时,都会抛出此异常:

  • 异常

    当IDENTITY_INSERT设置为OFF时,在表'ClientDetails'中的标识列上不能插入显式值。

然而,该表单没有字段可以输入到标识列(主键),所以我不知道为什么会发生这种情况。

目前我正在使用标准的asp.net mvc提交按钮,但最终我将链接到一个jquery对话框按钮

所述异常所指的ClientNo列具有以下属性

  • 名称-ClientNo
  • 类型-int
  • 空 - 否
  • Identity Spec - 是
  • Is Identity - 是
  • 增量 - 1
  • 起始值 - 1

ClientNo具有900等数据

当客户端表单中没有输入数据时也会抛出此异常

它在DataCOntext.SubmitChanges()方法上抛出

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create1(ClientDetail client)
        {
            if(ModelState.IsValid)
            { 
            client = new ClientDetail();



                UpdateModel(client);
                //Debug Code
                System.Diagnostics.Debug.WriteLine("AddNewClient Create1");
                repo.AddNewClient(client);
                //Debug Code
                System.Diagnostics.Debug.WriteLine("Save Create1");


                // System.Data.SqlClient.SqlException thrown at this line  
                repo.Save();

                //Debug Code - never reached
                System.Diagnostics.Debug.WriteLine("Saved Changes");


              //  return RedirectToAction("Details", new { id = client.ClientNo });




            }
            return View(client);
        }

public void AddNewClient(ClientDetail client)
       {    
            System.Diagnostics.Debug.WriteLine("Start Insert On Submit");

            db.ClientDetails.InsertOnSubmit(client);
            System.Diagnostics.Debug.WriteLine("Finish Insert On Submit");
       }

public void Save()
        {
            System.Diagnostics.Debug.WriteLine("In Save Method");
            db.GetChangeSet();
            System.Diagnostics.Debug.WriteLine("Got ChangeSet"); 
            db.SubmitChanges();
            System.Diagnostics.Debug.WriteLine("Exit Save Method");
        }
Is this the query everyone is talking about

[Column(Storage="_ClientNo", DbType="Int NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)]
        public int ClientNo
        {
            get
            {
                return this._ClientNo;
            }
            set
            {
                if ((this._ClientNo != value))
                {
                    this.OnClientNoChanging(value);
                    this.SendPropertyChanging();
                    this._ClientNo = value;
                    this.SendPropertyChanged("ClientNo");
                    this.OnClientNoChanged();
                }
            }
        }

有没有人知道为什么会发生这种情况,或者有解决方案?

谢谢


你如何向数据库“提交”数据? - Akram Shahda
当您想要向种子列添加值且identity_insert关闭时,会生成此错误。那么您是如何将数据保存到数据库中的? - FIre Panda
如果您能发布查询,那就太好了。 - Piyush
@Abdul Muq - 使用Linq to Sql类中的SubmitChanges方法。 - porps89
我似乎无法正确地使用代码块,但 Linq-Sql 中的查询是。 - porps89
[Column(Storage="_ClientNo", DbType="Int NOT NULL", IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)] public int ClientNo { get { return this._ClientNo; } set { if ((this._ClientNo != value)) { this.OnClientNoChanging(value); this.SendPropertyChanging(); this._ClientNo = value; this.SendPropertyChanged("ClientNo"); this.OnClientNoChanged(); } } } - porps89
2个回答

9

在ClientNo属性中添加IsDbGenerated=true

[Column(Storage="_ClientNo", DbType="Int NOT NULL", **IsDbGenerated=true,** IsPrimaryKey=true, UpdateCheck=UpdateCheck.Never)] 
public int ClientNo

在代码格式正确之前就知道答案的人加一分。 - Jodrell
这个答案不再适用了!为什么?我收到了这个错误信息:'System.ComponentModel.DataAnnotations.ColumnAttribute' 不包含 'IsPrimaryKey' 的定义。 - user1362208
@Tman 请确保使用的是 System.Data.Linq.Mapping.ColumnAttribute,而不是 System.ComponentModel.DataAnnotations.ColumnAttribute。 - archil
它表示“System.Data.Linq.Mapping.ColumnAttribute是一种类型而不是命名空间”。 - user1362208
@Tman,你的代码里有很多不对劲的地方。你错误地添加了using语句。此外,你不应该手动更改自动生成的文件。最好先阅读一些关于实体框架和Linq2Sql的文档。我猜你应该使用partial class来应用那个属性。 - archil

1

在插入操作中,您不能提供要插入到标识列的值。它们是作为INSERT操作的一个原子部分自动生成的。可以使用SET IDENTITY_INSERT命令在每个表上临时禁用此功能。

要么,您应该更改数据库架构,但我不建议这样做;或者更好的方法是,在插入时不提供值,或者为Client_NO列提供NULL值。

在SQL中,您可以使用SCOPE_IDENTITY()函数获取自动生成的值。模型将自动使用此值进行更新。

使用archil的答案告诉模型不要在生成的选择中传递此列。

[Column(Storage="_ClientNo",
    DbType="Int NOT NULL", 
    IsDbGenerated=true,
    IsPrimaryKey=true, 
    UpdateCheck=UpdateCheck.Never)]  
public int ClientNo

请注意将IsDBGenerated属性添加到属性中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接