【问题标题】:Does LINQ To SQL auto update the LOCAL/CLIENT id column after a SubmitChanges call?LINQ To SQL 是否在 SubmitChanges 调用后自动更新 LOCAL/CLIENT id 列?
【发布时间】:2010-01-18 04:24:40
【问题描述】:

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

【问题讨论】:

  • 你可以试试看会发生什么。如果是这样,那么您甚至可以在此处发布您自己的答案。

标签: c# asp.net sql vb.net linq


【解决方案1】:

是的,只要ColumnAttributeAutoSyncIsDbGenerated 分别设置为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

【讨论】:

    【解决方案2】:

    您可以通过查看映射属性的[Column] 属性(或<Column> 元素,如果您使用外部 XML 映射文件)来验证 IDENTITY 列是否会在 SubmitChanges() 上更新。

    [Column] 属性将设置两个属性,IsDbGenerated = trueAutoSync = OnInsert - 第一个属性告诉 LINQ 目标列的值是由数据库创建的,例如 IDENTITY 列或 TIMESTAMP / ROWVERSION 列,后者告诉 LINQ 使用数据库插入后的值更新模型对象。

    两个属性都需要像这样设置才能发生预期的行为。如果您使用 SqlMetal 或 Visual Studio 设计器,生成的代码通常会自动为您处理此问题,只要该列以 IDENTITY 或 TIMESTAMP 开头。如果稍后将该列更改为 IDENTITY 类型,则需要重新生成 LINQ 代码,或者自己手动更新属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      相关资源
      最近更新 更多