当前位置:  开发笔记 > 编程语言 > 正文

Linq to SQL:为什么我收到IDENTITY_INSERT错误?

如何解决《LinqtoSQL:为什么我收到IDENTITY_INSERT错误?》经验,为你挑选了2个好方法。

我正在使用Linq to SQL.我有一个DataContext,我就是.SubmitChanges()'.插入标识字段时出错:

当IDENTITY_INSERT设置为OFF时,无法在表'Rigs'中为identity列插入显式值.

唯一的标识字段是"ID",其值为0.它在DBML中定义为:

[Column(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]

有几个外键,我已经验证它们的值与外表的内容一致.

为什么我会收到此错误?

编辑:这是查询:

exec sp_executesql N'INSERT INTO [dbo].[Rigs]([id], [Name], [RAM], [Usage], [MoreInfo], [datetime], [UID])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)
SELECT [t0].[id], [t0].[OSID], [t0].[Monitors]
FROM [dbo].[Rigs] AS [t0]
WHERE [t0].[id] = @p7',N'@p0 int,@p1 varchar(1),@p2 int,@p3 varchar(1),@p4 varchar(1),@p5 datetime,@p6 int,@p7 
int',@p0=0,@p1='1',@p2=NULL,@p3='4',@p4='5',@p5=''2009-03-11 20:09:15:700'',@p6=1,@p7=0

尽管从未被赋予价值,但显然它正在传递零.

编辑:添加代码:

Rig rig = new Rig();
int RigID;
try
{ // Confirmed these always contain a nonzero value or blank
    RigID = int.Parse(lbSystems.SelectedValue ?? hfRigID.Value);
    if (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 (ListItem li in lbYourCards.Items)
{
    RigsToVideoCard r2vc = new RigsToVideoCard();
    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))   
    throw new ApplicationException("There was an error saving your Rig. I have been notified.");
hfRigID.Value = rig.id.ToString();

public static User GetUserByToken(string token)
{
    DataClassesDataContext dc = new DataClassesDataContext(ConfigurationManager.ConnectionStrings["MultimonOnlineConnectionString"].ConnectionString);
return (from u in dc.Users
    where u.LiveToken == token
    select u).FirstOrDefault();
}

另外,我注意到当我更新现有装备(insertonsubmit)时,它不会更新.Profiler甚至不显示正在运行的任何查询.



1> Oscar Ortiz..:

我对发生的事情的理论如下:

    您设计并创建了DataBase

    您在Visual Studio中使用LINQ TO SQL创建了数据库上下文

    您忘记将自动标识设置为您的表

    您通过转到DataBase并设置自动标识来修复此问题

    但是你忘了重新创建/更新你的LINQ TO SQL DB上下文!

:d



2> eglasius..:

您的代码是否将ID值明确设置为0?(而不是保持不变).

更新1:当您在更新版本上发布时,linq2sql显然将值传递给db.这是我没有遇到任何麻烦的:

[Column(Storage="_CustomerID", AutoSync=AutoSync.Always, DbType="Int NOT NULL IDENTITY", IsDbGenerated=true)]
public int CustomerID 

我刚刚看到另一个,它与你正在使用的那个具有相同的确切定义.

[Column(Storage="_TestID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public int TestID

更新2:关于更新,您不应该为此执行InsertOnSubmit.只需更新值并调用.SubmitChanges(应抛出异常).在插入它真的很奇怪,因为你发布的属性属性似乎是正确的,所以Insert方法linq2sql生成也应该是正确的.我会尝试,再次在设计器上重新添加表格并验证所有属性是否正确.

请注意,生成的insert方法应该看起来像(使用matchingRig_Insert):

private void InsertRig(Rig obj)
{
    System.Nullable p1 = obj.Id;

this.Rig_Insert(/*一堆值*/,ref p1); obj.Id = p1.GetValueOrDefault(); }

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有