2009-08-24 32 views
12

Tôi rất mới để LINQ to sql và tôi không chắc chắn làm thế nào để thực sự xóa một bản ghi.Làm thế nào để xóa trong LINQ để sql?

Vì vậy, tôi đã nhìn vào hướng dẫn này

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

Vì vậy, đối Update họ có

NorthwindDataContext db = new NorthwindDataContext(); 

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

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

db.SubmitChanges(); 

Đối xóa họ có

NorthwindDataContext db = new NorthwindDataContext(); 

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

db.Products.RemoveAll(toyProducts); 

db.SubmitChanges(); 

Vì vậy, tôi phải để truy vấn mỗi thời gian, để có được bản ghi để xóa bản ghi đó? Giống như tôi có thể sắp xếp làm điều này với bản cập nhật vì bạn cần phải cung cấp cho nó một bản ghi để cập nhật đầu tiên và sau đó thực hiện các thay đổi để tôi hiểu phần truy vấn nhưng không phải với xóa.

Giống như bạn không thể gửi những gì bạn muốn xóa và nó đi và xóa nó? tại sao bạn phải đầu tiên nhận được nó và sau đó nói với nó để bị xóa?

Đó không phải là 2 lần truy cập trên cơ sở dữ liệu phải không?

Ngoài ra tôi có mối quan hệ khóa ngoại mà tôi đang cố gắng làm việc. Vì vậy, tôi có điều này

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

} 

Vì vậy, điều này không thành công với thông báo này "Không thể xóa đối tượng chưa được đính kèm". Vì vậy, tôi có thể thấy lý do tại sao 2 dòng đầu tiên sẽ thất bại trong phương thức xóa, vì tôi đã tạo một đối tượng mới và chúng không có gì trong đối tượng có bất kỳ thông tin nào về TableB và TableC.

Tuy nhiên, tôi không thể thấy lý do tại sao dòng cuối cùng vẫn không thành công ngay cả khi 2 dòng khác không có ở đó.

Giống như cách tôi nghĩ nó sẽ hoạt động, nó sẽ lấy đối tượng lớp Bảng A của tôi mà tôi đã chuyển vào và xem qua bảng cho thông tin chứa trong đó. Nó không có vẻ là trường hợp mặc dù.

Vì vậy, trước tiên tôi phải lấy thông tin ra và sau đó thực hiện một truy vấn để lấy nó và sau đó xóa nó, như trong ví dụ?

Ngoài ra sự khác biệt giữa removeAll() và nói DeleteAllOnSubmit() là gì.

Giống như tôi đã nói tôi mới tham gia LINQ to sql và không thể ngồi xuống và đọc một cuốn sách về nó do thời gian hạn chế. Một khi tôi có nhiều thời gian hơn, tôi sẽ đọc qua một cuốn sách.

Cảm ơn

Trả lời

13

Bạn có một vài câu hỏi trong một câu hỏi của bạn, nhưng tôi sẽ bắt đầu với đơn giản nhất, về gắn, nếu bạn đã có khóa chính. Nếu bạn không có khóa chính thì tôi luôn thực hiện tìm nạp sau đó xóa, nhưng, bất cứ khi nào tôi thực hiện tìm nạp, tôi có xu hướng lưu trữ khóa chính để cập nhật và xóa.

Nó sẽ xóa khỏi khóa chính, nhưng nếu bạn có điều đó thì chỉ cần đính kèm như tôi làm bên dưới và gọi xóa. Tôi không vượt qua xung quanh đối tượng cần thiết bởi DLINQ vì tôi muốn có thể thay đổi nó nếu tôi muốn, vì vậy tôi chuyển vào một đối tượng User khác và chỉ kéo PK từ lớp nghiệp vụ và đưa nó vào lớp DAO.

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

Tôi đã thử cách này nhưng có vẻ như cố gắng sử dụng tất cả các giá trị trên đối tượng để định vị bản ghi. Lỗi với Hàng không tìm thấy hoặc đã bị thay đổi. Ý tưởng? – drizzie

+0

@drizzie - Bạn chỉ đưa khóa vào thể hiện thực thể của mình? –

+0

Có, mã của tôi giống với mã của bạn. – 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 = ""; 

nơi Item là tên Table, Linserted_LINQDataContext là tên LINQ DB của bạn, id là tên cột tại mục bảng. Các mục là tên bí danh của bảng Item trong LINQ.

Các vấn đề liên quan