簡體   English   中英

Linq to SQL:為什么我收到IDENTITY_INSERT錯誤?

[英]Linq to SQL: Why am I getting IDENTITY_INSERT errors?

我正在使用Linq to SQL。 我有一個DataContext,我就是.SubmitChanges()'。 插入標識字段時出錯:

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

唯一的標識字段是“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. 您設計並創建了DataBase
  2. 您在Visual Studio中使用LINQ TO SQL創建了數據庫上下文
  3. 您忘記將自動標識設置為您的表
  4. 您通過轉到DataBase並設置自動標識來修復此問題
  5. 但是你忘了重新創建/更新你的LINQ TO SQL DB上下文!

:d

您的代碼是否將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<int> p1 = obj.Id;

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

確保該列的dbml中的屬性“自動生成的值”設置為true。 如果沒有,LINQ將嘗試根據類型默認值。

如果要提供IDENTITY列的值,則必須添加

SET IDENTITY_INSERT ON

在您的SQL語句之前,和

SET IDENTITY_INSERT OFF 

之后將其關閉。 這適用於任何原始SQL。 如果您使用LINQ創建一個對象,如:

var customer = new LinqContext.Customer;
customer.FirstName = "Bob";
customer.LastName = "Smith";

LinqContent.Customer.Add(customer);
LinqContext.SubmitChanges();

我相信這會奏效,如果我上課錯了,請原諒我。 你得到了基本的想法。

編輯:哎呀..對不起,沒有看完整個問題,我把它拿回來,累了,疲憊不堪......

看起來你的ID被分配到某個地方(即使只是默認為0) - 你是否願意發布一些你的LINQ代碼?

我遇到了完全相同的問題。

我的解決方案是手動將標識INT列變為可空的 INT? DBML設計器中的列,當然不在DB的實​​際表中。 同時將DbType設置為NULL而不是NOT NULL。 像這樣:

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

這適用於所有數據庫操作。 插入時只需將identity列設置為NULL而不是0。

我的情況,我忘了在將Id列設置為identity后更新我的dbml文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM