2010-01-18 94 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

相关问题