2009-08-24 8 views
12

Je suis très nouveau à linq à sql et je ne suis pas sûr de savoir comment supprimer un enregistrement.Comment supprimer linq en sql?

Je regardé ce tutoriel

http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx

Donc, pour mise à jour, ils ont

NorthwindDataContext db = new NorthwindDataContext(); 

Product product = db.Products.Single(p => p.ProductName == "Toy 1"); 

product.UnitPrice == 99; 
product.UnitsInStock = 5; 

db.SubmitChanges(); 

Pour supprimer, ils ont

NorthwindDataContext db = new NorthwindDataContext(); 

var toyProducts = from p in db.Producsts 
       where p.ProductName.Contains("Toy") 
        select p; 

db.Products.RemoveAll(toyProducts); 

db.SubmitChanges(); 

Alors dois-je interroger tous les temps, pour obtenir l'enregistrement afin de supprimer cet enregistrement? Comme je peux le voir en faisant cela avec mise à jour puisque vous avez besoin de lui donner un enregistrement à mettre à jour en premier et ensuite faire les changements afin que je comprenne la partie interrogative mais pas avec supprimer.

Comme vous ne pouvez pas simplement envoyer ce que vous voulez supprimer et il va et supprime? Pourquoi avez-vous d'abord l'obtenir et ensuite dire qu'il soit supprimé?

N'est-ce pas 2 accès à la base de données?

J'ai aussi une relation de clé étrangère que j'essaie de mettre au travail. J'ai donc ce

public ViewResult(string param1, string param2) 
{ 
    Table A = new Table A 
    A.Field1 = param1; 
    A.Field2 = param2; 

    Delete(A); 
} 

private void Delete(Table A) 
{ 
    DbContext.A.DeleteAllOnsubmit(A.TableB); 
    DbContext.A.DeleteAllOnSubmit(A.TableC); 
    DbContext.A.DeleteOnSubmit(A); 

} 

Donc, cela ne fonctionne pas, il arrive avec ce message « Impossible de supprimer une entité qui n'a pas été fixé. »

Donc je peux voir pourquoi les 2 premières lignes échoueraient dans la méthode delete, puisque j'ai fait un nouvel objet et leur rien dans l'objet qui a des informations sur TableB et TableC.

Je ne vois pas pourquoi la dernière ligne échoue encore, même si les 2 autres lignes ne sont pas là. Comme je pensais que cela fonctionnerait, il faudrait que mon objet de classe Table A passe et que je consulte la table pour trouver les informations qui s'y trouvent. Cela ne semble pas être le cas cependant.

Alors, est-ce que je dois d'abord retirer l'information, puis faire une requête pour l'obtenir et ensuite la supprimer, comme dans l'exemple?

Aussi quelle est la différence entre removeAll() et dire DeleteAllOnSubmit(). Comme je l'ai dit, je suis nouveau à linq to sql et je n'ai pas pu m'asseoir et lire un livre dessus à cause des contraintes de temps. Une fois que j'aurai plus de temps, je lirai probablement un livre.

Merci

Répondre

13

Vous avez plusieurs questions dans votre une question, mais je vais commencer par le plus simple, sur l'attachement, si vous avez déjà la clé primaire. Si vous n'avez pas la clé primaire, alors j'ai toujours fait une extraction puis une suppression, mais chaque fois que je fais une extraction, j'ai tendance à stocker la clé primaire pour les mises à jour et les suppressions.

Il va supprimer de la clé primaire, mais si vous avez cela, il suffit de joindre comme je le fais ci-dessous et appeler la suppression. Je ne passe pas l'objet requis par DLINQ car je veux pouvoir le changer si je le souhaite, donc je passe dans un objet User différent et je retire simplement le PK de la classe business et le place dans la classe DAO.

var db = new MeatRequestDataContext();    
if (input.UserID > 0) 
{ 
    entity = new User() 
    { 
     UserID = input.UserID 
    }; 
    db.Users.Attach(entity); 
    db.Users.DeleteOnSubmit(entity); 
} 
+0

J'ai essayé ceci mais il semble essayer d'utiliser toutes les valeurs sur l'objet pour localiser l'enregistrement. Il erreurs avec Row non trouvé ou a été changé. Des idées? – drizzie

+0

@drizzie - Avez-vous seulement mis la clé dans votre instance d'entité? –

+0

Oui, mon code est identique au vôtre. – drizzie

2
 SupportDataDataContext Retrive = new SupportDataDataContext(); 
     // SupportDataDataContext delete = new SupportDataDataContext(); 

     Topic res = Retrive.GetTable<Topic>().Single(t => t.ID == topicID); 


     if (res != null) 
     { 
      Retrive.Topics.DeleteOnSubmit(res); 
      Retrive.SubmitChanges(ConflictMode.ContinueOnConflict); 
     } 
2
Inserted_LINQDataContext db = new Inserted_LINQDataContext(); 
       Item itm = new Item(); 
       int ID = Convert.ToInt32(TextBox1.Text); 
       var DeleteID = from d in db.Items 
           where d.id == ID 
           select d; 
       db.Items.DeleteAllOnSubmit(DeleteID); 
       db.SubmitChanges(); 
       Label2.Text = "Record deleted Successfully."; 
       TextBox1.Text = ""; 

où Le produit est Nom de la table, Linserted_LINQDataContext est votre nom Linq DB, id est le nom de la colonne dans le tableau de l'article. Items est le nom d'alias de la table Item dans linq.

Questions connexes