NullReferenceException при выполнении InsertOnSubmit в LINQ to SQL - PullRequest
25 голосов
/ 04 февраля 2010

В моей базе данных есть таблица StaffMembers

когда я добавляю это в свой .net Project, как через linq-to-sql, создается класс сущностей StaffMember

Теперь я также создал частичный класс StaffMember в своем проекте, чтобы добавить дополнительные свойства, которые я использую в других верхних слоях. например. IsDeleted свойство. Этот частичный класс также наследует абстрактный класс и интерфейс, чтобы обеспечить реализацию некоторых других свойств.

Теперь, когда я создаю новый экземпляр "StaffMember"

например. StaffMember newStaff = new StaffMember (); и дать ему все его свойства и т. д.

и затем вызовите InsertOnSubmit для контекста через мой Менеджер.

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

Я получаю Ошибка «Ссылка на объект не установлена ​​для экземпляра объекта».

для context.StaffMembers.InsertOnSubmit (newStaff);

В стеке написано

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

Любая идея, почему это происходит и как это обойти.

Спасибо

Ответы [ 2 ]

43 голосов
/ 04 февраля 2010

Хорошо, я нашел свой ответ на http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9f

на случай, если кто-то все еще ищет ответ.

Эта проблема возникает, когда вы перегружаете конструктор в частичном классе, а не вызываетеконструктор по умолчанию в нем.

Конструктор по умолчанию сущности делает несколько вещей, которые требуются для объекта Context.

Следовательно, если у вас есть перегруженный конструктор в вашем частичном классе и вы используете его для созданияобъект, убедитесь, что конструктор по умолчанию вызывается в первой строке

в C #, вы можете сделать это с помощью

например.

 Customer(string custID)

вам нужно добавить

 Customer(string custID):this()

в C #, где Customer - это мой класс, а Customer (строка custID): this () - мой конструктор перегрузки в моем частичном классе.

1 голос
/ 17 марта 2010

Иногда просто забыли добавить эту строку в базовый класс:

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

...