2010-01-18 41 views

回答

3

通過查看映射屬性的[Column]屬性(如果使用的是外部XML映射文件,則爲<Column>),可以驗證上的IDENTITY列將被更新。

有兩個屬性,這將在[Column]屬性進行設置,IsDbGenerated = true,和AutoSync = OnInsert - 第一屬性告訴LINQ目標列的值是由數據庫中創建諸如用於IDENTITY列或時間戳/ ROWVERSION列,且將後者告訴LINQ用數據庫插入後的值更新模型對象。

這兩個屬性都需要像這樣設置,以便發生預期行爲。如果您使用SqlMetal或Visual Studio設計器,那麼生成的代碼通常會自動爲您處理,只要列是IDENTITY或TIMESTAMP即可。如果稍後將列更改爲IDENTITY類型,則需要重新生成LINQ代碼,或者手動更新這些屬性。

5

是的,它只要AutoSyncColumnAttributeIsDbGenerated分別設置爲AutoSync.OnInserttrue

這樣:

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

這些設置在設計師訪問。 AutoSync.OnInserttrue是默認設置。

在這裏你可以看到在行動這一點:

var db = new MessageDataContext(); 
db.Log = Console.Out; 
Message m = new Message(); 
m.Text = "Hello, world!"; 
db.Messages.InsertOnSubmit(m); 
db.SubmitChanges(); 

這裏表Message有兩列Id(自動編號PK列)和Text。這將導致在控制檯上打印以下:

INSERT INTO [dbo].[Message]([Text]) 
VALUES (@p0) 

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 
-- @p0: Input VarChar (Size = 13; Prec = 0; Scale = 0) [Hello, world!] 
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.30729.1 

第二個SQL語句顯示DataContext自動檢索分配給我們插入到數據庫中Message身份。

因此:

db.Messages.InsertOnSubmit(m); 
db.SubmitChanges(); 
Console.WriteLine(m.Id); 

將打印分配給mId

相關問題