簡體   English   中英

LINQ插入不會在IDENTITY列插入上引發錯誤

[英]LINQ Insert NOT throwing error on IDENTITY Column insert

我對LINQ中的這種行為感到困惑。 當我嘗試使用SQL將值插入IDENTIY列時,出現錯誤。 但是,當我嘗試使用LINQ時,不會出現錯誤,並且插入值將被忽略。

例如:

表_1有2列。 第一個“ ID”是IDENTITY(1,1),在插入時遞增。 列2“ TextColumn”是varchar(50)。 如果我在SQL中運行以下查詢:

insert into Table_1 (id,TextColumn) values (1,'test')

我按預期收到此錯誤:

當IDENTITY_INSERT設置為OFF時,無法為表'Table_1'中的標識列插入顯式值。

但是,當我在C#中運行此代碼時,不會引發任何錯誤:

var db = new TestDBDataContext();
var table1 = new Table_1();
table1.ID = 1; // SHouldn't this cause an error?
table1.TextColumn = "Test Text to insert";
db.Table_1s.InsertOnSubmit(table1);
db.SubmitChanges();

在這種情況下,只會忽略int值“ 1”,並且ID列通常會自動遞增。 這是designer.cs文件中ID列的條目

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_ID", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]

我很困惑,為什么LINQ不會默認將這些值設置為“只讀”? 如果切換ID列的“只讀”屬性,則會得到預期的行為。 Set方法在ID對象的designer.cs中消失,並且代碼中出現錯誤。 謝謝!

您假設Linq2sql只是根據table1中的值盲目構建SQL語句。 實際上,它涉及的更多。 例如,如果您的表有10列,而您僅為其分配了5個值,則它將在insert語句中僅包含這5列。

因此,由於它知道您無法為數據庫中的ID分配值,因此它只是忽略了在C#代碼中這樣做的事實。

在這篇文章中,您的屬性在您的實體定義中被標記為“ Auto Generated Value ,或者在XML中被標記為IsDBGenerated (如Andrei在注釋中建議的那樣)。

https://stackoverflow.com/a/6139214/1729859

暫無
暫無

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

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