代码之家  ›  专栏  ›  技术社区  ›  tsilb

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

  •  6
  • tsilb  · 技术社区  · 17 年前

    Cannot insert explicit value for identity column in table 'Rigs' when IDENTITY_INSERT is set to OFF.

    [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();
    }
    

    7 回复  |  直到 12 年前
        1
  •  11
  •   Oscar Ortiz    10 年前

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

    1. 您在visual Studio中使用LINQ TO SQL创建了数据库上下文
    2. 你忘了为你的桌子设置自动身份
    3. 您通过转到数据库并设置自动标识来解决了这个问题
    4. 但是你忘了重新创建/更新LINQ to SQL数据库上下文!!!

    D

        2
  •  7
  •   eglasius    17 年前

    更新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:

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

    obj.Id=p1.GetValueOrDefault(); }

        3
  •  2
  •   Josh    15 年前

    确保该列的dbml中的属性“自动生成值”设置为true。如果没有,LINQ将尝试根据类型默认值。

        4
  •  1
  •   Chris    17 年前

    如果要提供IDENTITY列的值,则必须添加

    SET IDENTITY_INSERT ON
    

    SET IDENTITY_INSERT OFF 
    

    var customer = new LinqContext.Customer;
    customer.FirstName = "Bob";
    customer.LastName = "Smith";
    
    LinqContent.Customer.Add(customer);
    LinqContext.SubmitChanges();
    

    我相信这会奏效,如果我上课错了,请原谅我。你得到了基本的想法。

        5
  •  1
  •   Marek Karbarz    17 年前

        6
  •  0
  •   Hugo Nava Kopp    10 年前

    我也遇到了同样的问题。

    INT?列 ,当然不在DB的实际表中。此外

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

    这适用于所有数据库操作。简单插入时

        7
  •  0
  •   donstack    9 年前

    我的情况是,在将Id列设置为identity后,我忘了更新我的dbml文件。