【问题标题】:NullReferenceException when doing InsertOnSubmit in LINQ to SQL在 LINQ to SQL 中执行 InsertOnSubmit 时出现 NullReferenceException
【发布时间】:2011-01-12 23:22:55
【问题描述】:

在我的数据库中,我有一个名为 工作人员

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

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

现在当我创建“StaffMember”的新实例时

例如。 员工新员工 = 新员工会员(); 并赋予它所有属性等

然后通过我的 Manager 在上下文中调用 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"

知道为什么会发生这种情况以及解决方法。

谢谢

【问题讨论】:

    标签: c# linq-to-sql nullreferenceexception insertonsubmit


    【解决方案1】:

    好的,我找到了答案 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(string custID):this() 是我的部分类中的重载构造函数。

    【讨论】:

    • 天哪,我从来没有想过...谢谢!
    • 老兄,你为我节省了很多时间。非常感谢。
    • 对我来说没有帮助。
    • @AgentFire - 我也没有 - 你找到你的问题了吗?
    • @AgentFire - 问题最终与多线程有关 - 我在同时调用 InsertOnSubmit 时搞砸了一些事情......我不确定具体原因 - 也许对象跟踪不是线程安全,但在单个线程上处理解决了问题。
    【解决方案2】:

    有时,忘记在基类中添加这一行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多