Tout ce que vous devez faire est de créer une nouvelle instance de votre classe et puis appelez InsertOnSumbit() sur la table:
var foo = new MyFoo { Name = "foo1" };
var dc = new MyDataContext();
dc.Foos.InsertOnSubmit(foo);
dc.SubmitChanges();
l'autre chose que vous devez être sûr de comment vous incrémenter votre colonne ID. En général, je m'assure toujours d'utiliser le paramètre IDENTITY (1,1) sur mes colonnes d'ID. Ceci est déclaré sur votre colonne id de l'entité LINQ comme ceci:
[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]
public Int32 Id { get; set; }
Pour éviter les doublons, ce que vous avez vraiment besoin est ce que nous appelons dans ma boutique une fonctionnalité « ajouter ». À mon humble avis, cela est plus facile à réaliser avec une procédure stockée - nous avons même un modèle représenterons-nous:
USE [<Database_Name, sysobject, Database_Name>]
GO
CREATE PROCEDURE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>__append]
(
@id INT OUTPUT,
@<Key_Param, sysobject, Key_Param> <Key_Param_Type, sysobject, VARCHAR(50)>
)
AS
BEGIN
SELECT @id = [id] FROM [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] (NOLOCK) WHERE [<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>
IF @id IS NULL
BEGIN
INSERT INTO [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s] ([<Key_Param, sysobject, Key_Param>])
OUTPUT INSERTED.[id] INTO @inserted_ids
VALUES (@<Key_Param, sysobject, Key_Param>)
SELECT TOP 1 @id = [id] FROM @inserted_ids;
END
ELSE
BEGIN
UPDATE [<Schema, sysobject, dbo>].[<Table_Name, sysobject, Table_Name>s]
SET
[<Key_Param, sysobject, Key_Param>] = @<Key_Param, sysobject, Key_Param>
WHERE [id] = @id
END
END
GO
Il est possible de le faire dans LINQ si, juste une requête pour une liste d'identifiants existants (ou tout autre colonne vous hors de la saisie):
var dc = new MyDataContext();
var existingFoos = dc.Foos.ToList();
var newFoos = new List<Foo>();
foreach(var bar in whateverYoureIterating) {
// logic to add to newFoos
}
var foosToInsert = newFoos.Where(newFoo => !existingFoos.Any(existingFoo => newFoo.Id == existingFoo.Id));
dc.Foos.InsertAllOnSubmit(foosToInsert);
dc.SubmitChanges();
// use the next line if you plan on re-using existingFoos. If that's the case I'd wrap dc.SubmitChanges() in a try-catch as well.
existingFoos.AddRange(foosToInsert);
en attente de votre modification ... –
La solution LINQ semble assez lente. Interroger une table géante et charger le contenu dans la mémoire me semble irréalisable. Peut-être que je devrais rester avec l'approche SP. –
C'est ce que j'ai pensé ... Cependant, vous pouvez accélérer la solution LINQ en sélectionnant uniquement les propriétés dont vous avez vraiment besoin ... par exemple, juste la colonne ID. En outre, si vous pouvez réutiliser la requête "existante" pour plusieurs exécutions, cela vous aidera également. –