2010-02-04 27 views
24

Trong cơ sở dữ liệu của tôi, tôi có một bảng gọi là StaffMembersNullReferenceException khi làm InsertOnSubmit trong LINQ to SQL

khi tôi mang cái này vào Dự án .net tôi như thông qua LINQ-to-sql một StaffMember lớp thực thể được tạo ra

Bây giờ tôi cũng đã tạo ra một lớp StaffMember một phần trong dự án của tôi, để thêm các thuộc tính bổ sung mà tôi sử dụng trong các lớp trên cùng khác. ví dụ. Thuộc tính IsDeleted. Lớp một phần này cũng thừa hưởng một lớp trừu tượng và giao diện để đảm bảo một số thuộc tính khác cũng được thực hiện.

Bây giờ, khi tôi tạo một phiên bản mới của "StaffMember"

ví dụ: StaffMember newStaff = new StaffMember(); và cung cấp tất cả các thuộc tính của nó, v.v.

và sau đó gọi InsertOnSubmit trên ngữ cảnh thông qua Trình quản lý của tôi.

Add(StaffMember newStaff) 
{ 
    context.StaffMembers.InsertOnSubmit(newStaff); 
    context.Save(); 
} 

Tôi nhận được lỗi "Tham chiếu đối tượng không được đặt thành trường hợp của đối tượng".

trên ngữ cảnh.StaffMembers.InsertOnSubmit (newStaff);

Các stack nói

" at System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance)\r\n at 
System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.get_HasDeferredLoaders()\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj)\r\n at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)\r\n at 
BusinessObjects.StaffMemberManager.Add(StaffMember staffMember) in  
C:\\StaffMemberManager.cs:line 251" 

Bất cứ ý tưởng tại sao này được xảy ra và các con đường xung quanh đó là những gì.

Cảm ơn

Trả lời

42

Được rồi tôi tìm thấy câu trả lời của tôi trên http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9f

trong trường hợp một số vẫn đang tìm kiếm một câu trả lời.

Sự cố này xảy ra khi bạn quá tải hàm tạo trong lớp một phần và không gọi hàm tạo mặc định trong đó.

Hàm khởi tạo mặc định của thực thể thực hiện một vài điều mà đối tượng Context yêu cầu.

Do đó nếu bạn có một nhà xây dựng quá tải trong partial class của bạn và sử dụng nó để tạo ra các đối tượng, chắc chắn rằng các nhà xây dựng mặc định được gọi là trong dòng đầu tiên

trong C# bạn có thể làm điều này bằng

ví dụ .

Customer(string custID) 

bạn cần phải thêm một

Customer(string custID):this() 

trong C# nơi khách hàng là tầng lớp và Khách hàng (string ID Khách hàng) của tôi: đây() là nhà xây dựng quá tải của tôi trong lớp một phần của tôi.

+0

1 Giải Quyết vấn đề của tôi! Cảm ơn vì bài đăng!! – xandercoded

+0

Chỉ cần giải quyết vấn đề của tôi là tốt .. cảm ơn nhiều – Quango

+0

Chúa Giêsu, tôi chưa bao giờ nghĩ về điều đó ... Cảm ơn! – Shackles

1

Đôi khi, chỉ cần quên để thêm dòng này vào các lớp cơ sở:

[InheritanceMapping (Mã số = "Class", Type = typeof (Class))]