LINQ to SQL insert-si-inexistante
Je voudrais savoir si il y a un moyen plus simple d'insérer un enregistrement si elle n'existe pas déjà dans une table. Je suis toujours en train de construire mon LINQ to SQL compétences.
Voici ce que j'ai, mais il semble qu'il devrait y avoir un moyen plus facile.
public static TEntity InsertIfNotExists<TEntity>
(
DataContext db,
Table<TEntity> table,
Func<TEntity,bool> where,
TEntity record
)
where TEntity : class
{
TEntity existing = table.SingleOrDefault<TEntity>(where);
if (existing != null)
{
return existing;
}
else
{
table.InsertOnSubmit(record);
//Can't use table.Context.SubmitChanges()
//'cause it's read-only
db.SubmitChanges();
}
return record;
}
Vous devez vous connecter pour publier un commentaire.
Comme d'autres l'ont souligné, le
if (!Any()) { InsertOnSubmit(); }
solutions ont toutes une condition de course. Si vous choisissez cette voie, lorsque vous appelezSubmitChanges
, vous devez prendre en compte le fait que ce soit un) uneSqlException
pourraient être soulevées par un double insert, ou b) vous pourriez avoir des doublons dans la table.Heureusement, nous pouvons utiliser la base de données pour éviter la condition de la course par l'application de l'unicité. Le code suivant suppose qu'il existe une contrainte primary key ou unique sur la table pour empêcher l'insertion de doublons.
Maintenant... les choses deviennent un peu juste plus compliqué si vous devez effectuer l'insertion dans un lot de transactions avec d'autres mises à jour de la base de données.
D'accord avec marxidad réponse, mais voir la note 1.
Remarque 1: à mon humble avis, il n'est pas sage d'appeler
db.SubmitChanges()
dans une méthode d'aide, parce que vous risquez de casser le contexte de la transaction. Cela signifie que si vous appelez laInsertIfNotExists<TEntity>
au milieu d'un complexe de mise à jour de plusieurs entités vous enregistrez les modifications ne sont pas à la fois, mais dans les étapes.Note 2: Le
InsertIfNotExists<TEntity>
méthode est très générique de la méthode qui fonctionne pour n'importe quel scénario. Si vous voulez juste discriminer les entités qui ont chargé à partir de la base de données à partir des entités qui ont été créé à partir du code, vous pouvez utiliser la partielle méthodeOnLoaded
de l'Entité de la classe comme ceci:Étant donné que (et la note 1), puis InsertIfNotExists fonctionnalité est réduit à ce qui suit:
Petite modification pour la Marque de la réponse:
Si vous ne se soucient que de vérifier si l'entité existe par sa clé primaire, Marke de réponse peut être utilisée comme ceci: