2009-08-24 12 views
12

Soy muy nuevo en linq a sql y no estoy seguro de cómo eliminar realmente un registro.Cómo eliminar en linq a sql?

Así que ha estado buscando a este tutorial

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

Así Actualizar tienen

NorthwindDataContext db = new NorthwindDataContext(); 

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

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

db.SubmitChanges(); 

Para eliminar tienen

NorthwindDataContext db = new NorthwindDataContext(); 

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

db.Products.RemoveAll(toyProducts); 

db.SubmitChanges(); 

Así que tengo que consultar cada hora, para obtener el registro para eliminar ese registro? Como que puedo ver cómo lo hago con la actualización, ya que necesita darle un registro que actualizar primero y luego hacer los cambios para que entienda la parte de consulta, pero no con la eliminación.

¿No puede simplemente enviar lo que desea eliminar y lo va a borrar? ¿Por qué primero tienes que conseguirlo y luego decir que se elimine?

¿No es así 2 resultados en la base de datos?

También tengo una relación de clave externa que estoy tratando de poner en práctica. Así que tengo este

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); 

} 

así que esto no se trata con este mensaje "No se puede eliminar una entidad que no se ha unido."

Entonces puedo ver por qué las primeras 2 líneas fallarían en el método de eliminación, ya que hice un nuevo objeto y no hay nada en el objeto que tenga información sobre TableB y TableC.

Sin embargo, no puedo ver por qué la última línea aún falla, incluso si las otras 2 líneas no están allí.

Al igual que pensé que funcionaría, tomaría el objeto de clase de la Tabla A que pasé y mire a través de la tabla para ver la información que contiene. Sin embargo, no parece ser el caso.

¿Debo extraer la información y hacer una consulta para obtenerla y luego eliminarla, como en el ejemplo?

También, ¿cuál es la diferencia entre removeAll() y decir DeleteAllOnSubmit().

Como dije, soy nuevo en linq to sql y no he podido sentarme y leer un libro debido a limitaciones de tiempo. Una vez que tenga más tiempo, probablemente leeré un libro.

Gracias

Respuesta

13

tienes varias preguntas en su sola pregunta, pero voy a empezar con el más simple, acerca de cómo adjuntar, si ya tiene la clave principal. Si no tiene la clave primaria, siempre he hecho una búsqueda y luego una eliminación, pero, cada vez que hago una búsqueda, tiendo a almacenar la clave primaria para las actualizaciones y las elimina.

Eliminará de la clave principal, pero si tiene eso, simplemente adjúntelo como hago a continuación y llame a eliminar. No paso el objeto que DLINQ necesita, ya que quiero poder cambiarlo si quiero, así que paso un objeto de usuario diferente y simplemente saco el PK de la clase de negocios y lo pongo en la clase DAO.

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

Lo he intentado pero parece intentar usar todos los valores en el objeto para ubicar el registro. Error con la fila no encontrada o ha sido modificada. Ideas? – drizzie

+0

@drizzie - ¿Puso solo la clave en la instancia de su entidad? –

+0

Sí, mi código es idéntico al suyo. – 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 = ""; 

cuando el punto es el nombre de la tabla, Linserted_LINQDataContext es su nombre LINQ DB, id es el nombre de la columna en la tabla de artículos. Items es el nombre de alias de la tabla Item en linq.