2008-10-14 3 views
2

Lors de la création d'un nouvel objet mappé à l'une de mes tables SQL Server, LINQ insère un nouvel enregistrement dans la table lorsque j'appelle SubmitChanges. Je veux empêcher cela, mais j'ai toujours besoin de mon nouvel objet.Comment empêcher l'insertion de nouveaux enregistrements dans des tables en utilisant Linq et SQL?

Je connais les méthodes personnalisées, mais il existe de toute façon pour désactiver ce comportement afin qu'il mette simplement à jour les enregistrements existants et n'insère jamais de nouveaux enregistrements, que j'aie ou non appelé MyTableClass myObject = new MyTableClass().

Merci.

+0

Le « nouveau » par lui-même ne rien faire ... vous auriez besoin de sortir de votre façon de l'ajouter (Attach/InsertOnSubmit) au contexte ...? –

Répondre

0

Ne pouvez-vous pas l'empêcher côté serveur? Connectez-vous en tant que rôle qui n'a pas d'accès d'insertion. Tôt ou tard, ce sera la façon la plus à l'épreuve des balles de prévenir les insertions, je suppose.

+0

Nous utilisons Windows auth, donc en utilisant une application qu'ils peuvent insérer, mais d'autres applications qu'ils ne devraient pas, par exemple. – HAdes

2

Vous pouvez toujours créer une procédure stockée qui ne fait rien et l'allouer au rôle d'insertion - c'est un vrai hack mais ça va faire le travail!

Je suggérerais que le fait que ce problème arrive peut-être indique qu'il y a quelque chose qui cloche dans l'approche que vous adoptez pour référencer cet objet - qu'est-ce qui nécessite précisément l'utilisation de ce nouvel objet?

2

Si vous voulez que vos données contexte barf encarts, vous pouvez faire:

partial class DataClasses1DataContext 
{ 
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode) 
    { 
     if(GetChangeSet().Inserts.OfType<MyObject>().Any()) 
     { 
      throw new InvalidOperationException("No inserts!"); 
     } 
     base.SubmitChanges(failureMode); 
    } 
} 

bon?

[était: Pourriez-vous simplement l'ajouter comme "clean" - c'est-à-dire Attach (obj, false);

Si vous ne voulez pas l'objet dans le modèle, pourquoi ajouter au contexte de données?]

+0

Parce que je dois toujours être en mesure de récupérer les données et mettre à jour les données, il suffit de ne pas insérer. – HAdes

+0

Merci. Ce ne sont pas tous les inserts que je veux éviter, mais une seule table. Je vais essayer votre Attach (obj, false), mais je devrai passer le datacontext autour de tous mes objets, ce que je n'aime pas. – HAdes

+0

Pouvez-vous clarifier: est-ce un enfant sur un enregistrement nouveau/existant? –

Questions connexes