LinqtoSQL:为什么我会收到IDENTITY_INSERT错误?我正在使用LinqtoSQL。我有一个DataContext,我只是.SubmitChanges()。插入标识字段时出错:当IDENTITY_INSERT设置为OFF时,无法在表“Rigs”中为标识列插入显式值。唯一的身份字段是“ID”,值为0。它在DBML中定义为:[Column(Storage="_ID",AutoSync=AutoSync.OnInsert,DbType="IntNOTNULLIDENTITY",IsPrimaryKey=true,IsDbGenerated=true)]有几个外键,我验证过它们的值和外表的内容是一致的。为什么会出现此错误?编辑:这是查询:execsp_executesqlN'INSERTINTO[dbo].[Rigs]([id],[Name],[RAM],[Usage],[MoreInfo],[datetime],[UID])VALUES(@p0,@p1,@p2,@p3,@p4,@p5,@p6)选择[t0].[id],[t0].[OSID],[t0].[Monitors]FROM[dbo].[Rigs]AS[t0]WHERE[t0].[id]=@p7',N'@p0int,@p1varchar(1),@p2int,@p3varchar(1),@p4varchar(1),@p5日期时间,@p6int,@p7int',@p0=0,@p1='1',@p2=NULL,@p3='4',@p4='5',@p5=''2009-03-1120:09:15:700'',@p6=1,@p7=0显然它正在传递零,尽管它从未被赋予一个值。编辑:添加代码:Rigrig=newRig();内部刚体ID;try{//确认这些始终包含非零值或空白RigID=int.Parse(lbSystems.SelectedValue??hfRigID.Value);如果(RigID>0)rig=mo.utils.RigUtils.GetByID(RigID);}catch{}rig.Name=Server.HtmlEncode(txtName.Text);rig.OSID=int.Parse(ddlOS.SelectedValue);rig.Monitors=int.Parse(txtMonitors.Text);rig.Usage=Server.HtmlEncode(txtUsage.Text);rig.MoreInfo=Server.HtmlEncode(txtMoreInfo.Text);rig.RigsToVideoCards.Clear();foreach(lbYourCards.Items中的ListItemli){RigsToVideoCardr2vc=newRigsToVideoCard();r2vc.VCID=int.Parse(li.Value);rig.RigsToVideoCards.Add(r2vc);}rig.UID=c_UID>0?c_UID:mo.utils.UserUtils.GetUserByToken(this.Master.LiveToken).ID;if(!mo.utils.RigUtils.Save(rig))thrownewApplicationException("保存你的Rig时出错。我已收到通知。");hfRigID.Value=rig.id.ToString();公共静态用户GetUserByToken(字符串令牌){DataClassesDataContextdc=newDataClassesDataContext(ConfigurationManager.ConnectionStrings["MulmonOnlineConnectionString"].ConnectionString);return(fromuindc.Userswhereu.LiveToken==tokenselectu).FirstOrDefault();此外,我注意到当我更新现有装备时(insertonsubmit),它不会更新Profiler,甚至不会显示正在运行的任何查询。您的代码是否明确将ID值设置为0?(而不是保持不变)。更新1:正如您在较新版本上发布的那样,linq2sql显然将值传递给了数据库。这是我没有遇到任何问题的一个:[Column(Storage="_CustomerID",AutoSync=AutoSync.Always,DbType="IntNOTNULLIDENTITY",IsDbGenerated=true)]publicintCustomerID我刚刚看到另一个,它与您正在使用的定义完全相同。[Column(Storage="_TestID",AutoSync=AutoSync.OnInsert,DbType="IntNOTNULLIDENTITY",IsPrimaryKey=true,IsDbGenerated=true)]publicintTestID更新2:关于更新,您不应该为此执行InsertOnSubmit。只需更新值并调用.SubmitChanges(应抛出异常)。在插入时它真的很奇怪,因为你发布的属性属性似乎是正确的,所以Insert方法linq2sql生成也应该是正确的。我会尝试再次在设计器上重新添加表单并验证所有属性是否正确。请注意,生成的插入方法应该类似于(使用matchingRig_Insert):privatevoidInsertRig(Rigobj){System.Nullablep1=obj.Id;this.Rig_Insert(/*一堆值*/,refp1);obj.Id=p1.GetValueOrDefault();我对发生的事情的理论如下:您设计并创建了数据库您使用LINQTOSQL在VisualStudio中创建了数据库上下文您忘记为表设置自动标识您通过了GotoDataBase并设置了自动标识来修复这但是你忘了重新创建/更新你的LINQTOSQLDB上下文!:D确保在该列的dbml中将属性“Autogeneratedvalue”设置为true。如果不是,LINQ将尝试基于类型的默认值。如果要提供IDENTITY列的值,则必须在SQL语句之前添加SETIDENTITY_INSERTON,并在其后添加SETIDENTITY_INSERTOFF以将其关闭。这适用于任何原始SQL。如果您使用LINQ创建一个对象,例如:varcustomer=newLinqContext.Customer;customer.FirstName="鲍勃";customer.LastName="史密斯";LinqContent.Customer.Add(客户);LinqContext.SubmitChanges();我相信我这会奏效,如果我对课程有误,请原谅我。你明白了基本的想法。编辑:哎呀..对不起,没读完整个问题,我把它收回来,累了,筋疲力尽了......看起来你的ID被分配到某个地方(即使它只是默认为0)-你愿意发布一些LINQ代码?我遇到了完全相同的问题。我的解决方案是手动使标识INT列成为可为空的INT?DBML设计器中的列,当然不在DB中的实际表中。同时将DbType设置为NULL而不是NOTNULL。像这样:[Column(Storage="_TestID",AutoSync=AutoSync.OnInsert,DbType="IntNULLIDENTITY",IsPrimaryKey=true,IsDbGenerated=true)]publicint?TestID这适用于所有数据库操作。只需在插入时将标识列设置为NULL而不是0即可。就我而言,我忘记在将Id列设置为标识后更新我的dbml文件。以上是C#学习教程:LinqtoSQL:WhyamIgettinganIDENTITY_INSERTerror?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
