2010-02-04 13 views
24

W mojej bazy danych mam tabeli o nazwie StaffMembersNullReferenceException gdy robi InsertOnSubmit w LINQ to SQL

kiedy przynieść to do mojego projektu .net za pośrednictwem LINQ-SQL StaffMember klasa podmiot utworzony

Teraz również utworzyłem w moim projekcie częściową StaffMember klasy, aby dodać dodatkowe właściwości, których używam w innych najwyższych warstwach. na przykład. Właściwość IsDeleted. Ta klasa cząstkowa dziedziczy również klasę abstrakcyjną i interfejs, aby upewnić się, że zaimplementowane są również inne właściwości.

Teraz gdy tworzę nową instancję "StaffMember"

np. StaffMember newStaff = new StaffMember(); i podaj jej wszystkie właściwości itd.

, a następnie wywołaj metodę InsertOnSubmit w kontekście za pośrednictwem mojego menedżera.

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

Dostaję „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu” błąd.

w kontekście. StaffMembers.InsertOnSubmit (newStaff);

Stos mówi

" 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" 

Każdy pomysł, dlaczego to się działo i co się dookoła niego.

Dzięki

Odpowiedz

42

Dobra znalazłem moją odpowiedź na http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9f

w przypadku niektórych wciąż szuka odpowiedzi.

Ten problem występuje, gdy przeciążasz konstruktor w klasie częściowej i nie wywołujesz w nim domyślnego konstruktora.

Domyślny konstruktor obiektu wykonuje kilka rzeczy wymaganych przez obiekt kontekstu.

Stąd jeśli masz przeciążenie konstruktora w swojej częściowej klasy i wykorzystaniu go do utworzenia obiektu, upewnij się, że domyślny konstruktor nazywa się w pierwszej linii

w C# można to zrobić poprzez

np .

Customer(string custID) 

trzeba dodać

Customer(string custID):this() 

w C#, gdzie klient jest moja klasa i klienta (string custid): to() jest moim konstruktora przeciążenie w moim częściowej klasy.

+0

+1 rozwiązać mój problem! Dzięki za post!! – xandercoded

+0

Właśnie rozwiązałem mój problem .. wielkie dzięki – Quango

+0

Jezu, nigdy nie myślałem o tym ... Dzięki! – Shackles

1

Czasami, po prostu zapomniał dodać tę linię do klasy bazowej:

[InheritanceMapping (Code = "Klasa" Type = typeof (Class))]