2010-01-18 8 views

Répondre

3

Vous pouvez vérifier qu'une colonne IDENTITY sera mise à jour SubmitChanges() en regardant l'attribut [Column] pour la propriété mappée (ou élément <Column> si vous utilisez un fichier de mappage XML externe).

Il y a deux propriétés qui seront définies sur l'attribut [Column], IsDbGenerated = true et AutoSync = OnInsert - le premier attribut indique LINQ que la valeur de la colonne cible est créée par la base de données telles que des colonnes d'identité ou timestamp/rowversion, et Ce dernier indique à LINQ de mettre à jour l'objet modèle avec la valeur après l'insertion d'une base de données.

Les deux propriétés doivent être définies de la sorte pour que le comportement attendu se produise. Si vous utilisez SqlMetal ou le concepteur Visual Studio, le code généré le gérera automatiquement pour vous, tant que la colonne était IDENTITY ou TIMESTAMP pour commencer. Si vous modifiez ultérieurement la colonne en un type IDENTITY, vous devrez soit régénérer le code LINQ, soit mettre à jour manuellement les attributs.

5

Oui, il le fait aussi longtemps que le AutoSync et IsDbGenerated de ColumnAttribute sont mis à AutoSync.OnInsert et true respectivement.

Ainsi:

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

Ces paramètres sont accessibles dans le concepteur. AutoSync.OnInsert et true sont les paramètres par défaut.

Ici vous pouvez voir en action:

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

Voici la table Message a deux colonnes Id (une autonumber colonne PK) et Text. Cela provoque ce qui suit à imprimer sur la console:

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 

La deuxième instruction SQL affiche la DataContext récupérer automatiquement l'identité attribuée à la Message que nous avons inséré dans la base de données.

Ainsi:

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

imprimera le Id attribué à m.

Questions connexes