在LINQ to SQL中执行InsertOnSubmit时出现NullReferenceException

sol*_*man 25 c# insertonsubmit nullreferenceexception linq-to-sql

在我的数据库中,我有一个名为StaffMembers的表

当我通过linq-to-sql将它带入我的.net项目时,会创建一个实体类StaffMember

现在我还在我的项目中创建了一个部分类StaffMember,以添加我在其他顶层使用的额外属性.例如.IsDeleted属性.此partial类还继承了一个抽象类和接口,以确保还实现了一些其他属性.

现在当我创建一个新的"StaffMember"实例时

例如.StaffMember newStaff = new StaffMember(); 并赋予其所有属性等

然后通过我的Manager调用上下文中的InsertOnSubmit.

Add(StaffMember newStaff)
{
     context.StaffMembers.InsertOnSubmit(newStaff);
     context.Save();
}
Run Code Online (Sandbox Code Playgroud)

我得到一个"对象引用没有设置为对象的实例"错误.

on 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"
Run Code Online (Sandbox Code Playgroud)

任何想法为什么会发生这种情况以及它的方式是什么.

谢谢

sol*_*man 43

好吧,我发现我的答案上 http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9f

如果有些人还在寻找答案.

当您重载部分类中的构造函数,而不调用其中的默认构造函数时,会发生此问题.

实体的默认构造函数执行Context对象所需的一些操作.

因此,如果在部分类中有一个重载构造函数并使用它来创建对象,请确保在第一行中调用默认构造函数

在C#中你可以做到这一点

例如.

 Customer(string custID)
Run Code Online (Sandbox Code Playgroud)

你需要添加一个

 Customer(string custID):this()
Run Code Online (Sandbox Code Playgroud)

在C#中,Customer是我的类和Customer(字符串custID):this()是我的部分类中的重载构造函数.