在SubmitChanges调用之后,LINQ To SQL是否自动更新LOCAL/CLIENT id列?

Erx*_*der 4 c# sql linq vb.net asp.net

只是想知道在调用SubmitChanges后,linq to sql auto更新了类(表行对象)的id列,在该表中插入一个新行,这太棒了,是否有人能够确认这一点?

jas*_*son 5

是的,只要不作为AutoSyncIsDbGeneratedColumnAttribute设置为AutoSync.OnInserttrue分别.

从而:

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

这些设置可在设计器中访问.AutoSync.OnInsert并且true是默认设置.

在这里你可以看到这个:

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

这里的表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
Run Code Online (Sandbox Code Playgroud)

第二个SQL语句显示DataContext自动检索分配给Message我们插入数据库的标识.

从而:

db.Messages.InsertOnSubmit(m);
db.SubmitChanges();
Console.WriteLine(m.Id);
Run Code Online (Sandbox Code Playgroud)

将打印Id分配给m.