【发布时间】:2010-01-18 04:24:40
【问题描述】:
只想知道 linq to sql 是否在调用 SubmitChanges 后自动更新了类(表行对象)的 id 列,将新行插入到该表中,这太棒了,有人能确认吗?
【问题讨论】:
-
你可以试试看会发生什么。如果是这样,那么您甚至可以在此处发布您自己的答案。
标签: c# asp.net sql vb.net linq
只想知道 linq to sql 是否在调用 SubmitChanges 后自动更新了类(表行对象)的 id 列,将新行插入到该表中,这太棒了,有人能确认吗?
【问题讨论】:
标签: c# asp.net sql vb.net linq
是的,只要ColumnAttribute 的AutoSync 和IsDbGenerated 分别设置为AutoSync.OnInsert 和true 就可以。
因此:
[Column(
Storage="_Id",
AutoSync=AutoSync.OnInsert,
DbType="Int NOT NULL IDENTITY",
IsPrimaryKey=true,
IsDbGenerated=true
)]
这些设置可在设计器中访问。 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();
这里的表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);
将打印分配给m的Id。
【讨论】:
您可以通过查看映射属性的[Column] 属性(或<Column> 元素,如果您使用外部 XML 映射文件)来验证 IDENTITY 列是否会在 SubmitChanges() 上更新。
[Column] 属性将设置两个属性,IsDbGenerated = true 和 AutoSync = OnInsert - 第一个属性告诉 LINQ 目标列的值是由数据库创建的,例如 IDENTITY 列或 TIMESTAMP / ROWVERSION 列,后者告诉 LINQ 使用数据库插入后的值更新模型对象。
两个属性都需要像这样设置才能发生预期的行为。如果您使用 SqlMetal 或 Visual Studio 设计器,生成的代码通常会自动为您处理此问题,只要该列以 IDENTITY 或 TIMESTAMP 开头。如果稍后将该列更改为 IDENTITY 类型,则需要重新生成 LINQ 代码,或者自己手动更新属性。
【讨论】: