2009-06-23 21 views
12

Tôi đang cố gắng chèn bản ghi. Mã này đã hoạt động nhưng đã ngừng hoạt động Tôi không biết tại sao. Đây là mã:Chèn LINQ to SQL Basic cơ bản: Đính kèm hoặc Thêm ngoại lệ liên quan đến thực thể mới

using (SAASDataContext dc = new SAASDataContext()) 
{ 
    tblAssessment a2 = new tblAssessment(); 

    a2.AssessmentCentreId = centreId; 
    a2.AttemptNumber = 1; 

    dc.tblAssessments.InsertOnSubmit(a2); 
    dc.SubmitChanges(); 

    CurrentAssessmentId = a2.AssessmentId; 
} 

Mã biên dịch nhưng ném ngoại lệ bên dưới trên đường dc.SubmitChanges();.

ngoại lệ ném:

Một cố gắng đã được thực hiện để Đính kèm hoặc Thêm một thực thể đó không phải là mới, có lẽ đã được nạp từ một DataContext. Đây không phải là được hỗ trợ.

Ghi chú: AssessmentCentreId là một khoá ngoại trên tblCentre, centreId là một id trung tâm hiện hữu hợp lệ, AssessmentCentreId và AttemptNumber là chỉ không ruộng rỗng tất cả các cột khác cho phép null.

Tôi đã googled nhưng tất cả các kết quả dường như liên quan đến những người cố gắng đính kèm các thực thể kéo từ DataContext bị ngắt kết nối của tôi không làm điều đó vì vậy tôi stumped.

UPDATE:

Thêm

dc.DeferredLoadingEnabled = false; 

ở phía trên cùng của khối sử dụng làm cho nó hoạt động, nhưng tôi muốn biết tại sao coz Tôi không có ý tưởng tại thời điểm công nghệ tiên tiến đủ không thể phân biệt được với ma thuật ngay bây giờ :)

+2

Tôi đang cung cấp +1 này để làm cho tôi cười - cùng có cùng vấn đề ... – John

Trả lời

4

Vấn đề là đối tượng Trung tâm không tồn tại trong ngữ cảnh. Đó là trong db, nhưng không phải "trong tay của bạn" với a2.Hãy thử điều này:

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId)); 

Đối tượng AssessmentCentre sẽ tồn tại trong ngữ cảnh, có nghĩa là sẽ không có vấn đề gì khi gắn nó vào a2.

0

Nếu đây là những cột không có giá trị duy nhất, thì khóa chính là ở đâu? LINQ to SQL yêu cầu một khóa chính để chèn dữ liệu. Nếu bạn đang sử dụng AssessmentCentreId một mình hoặc cùng với FixedNumber dưới dạng tổng hợp, bạn có chắc chắn bạn không cố gắng chèn một khóa trùng lặp không?

+0

Khoá chính cũng không phải là rỗng và là danh tính tự động (1,1) –

7

Điều này cũng làm tôi thất vọng. Tôi đã làm một số tìm kiếm và tìm thấy rất nhiều sự nhầm lẫn và một số công việc cẩu thả xung quanh liên quan đến các thực thể tách ra. Sau đó tôi tìm thấy một giải pháp tốt đẹp trên codeplex đã giải quyết vấn đề ngay lập tức và đã mở rộng rất nhiều chức năng linq2sql. Đó là một lớp nhỏ thats thực sự dễ dàng để thực hiện và tạo thành một EntityBase cho các dự án của bạn dbml.

Dưới đây là mô tả và liên kết chính thức. LINQ to SQL Entity Base là một lớp cơ sở đơn giản được thiết kế chủ yếu để hỗ trợ LINQ to SQL theo cách bị ngắt kết nối, đó là một trong những thiếu sót của công nghệ LINQ to SQL tại thời điểm hiện tại. Điều này rất hữu ích trong một môi trường n-Tier, phân tán hoặc ASP.NET, nơi chức năng bị ngắt kết nối là relavent.

http://linq2sqleb.codeplex.com/

Hope this helps bất cứ ai đang có tương tự.

Jerome Vernon

+0

Điều này thực sự hữu ích, giao dịch với các thực thể bị ngắt kết nối là sự sụp đổ lớn nhất khi sử dụng L2SQL trên WCF – Neil

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