C# LINQ InsertOnSubmit:NullReferenceException

C# LINQ InsertOnSubmit:NullReferenceException,c#,asp.net,linq,linq-to-sql,nullreferenceexception,C#,Asp.net,Linq,Linq To Sql,Nullreferenceexception,我有以下代码: using DC = MV6DataContext; using MV6; // Business Logic Layer // ... public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString); IP ip = new IP(Request.UserHostAddress); dc.IPs.InsertOnSubmit(ip); dc.SubmitChanges(); // in Busine

我有以下代码:

using DC = MV6DataContext;
using MV6; // Business Logic Layer
// ...

public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString);
IP ip = new IP(Request.UserHostAddress);
dc.IPs.InsertOnSubmit(ip);
dc.SubmitChanges();

// in Business Logic layer:
public class IP : DC.IP {
  public IP(string address) { ... }
}
在尝试InsertOnSubmit(ip)时,我得到一个NullReferenceException(对象引用未设置为对象的实例)。dc不为空;ip和ip的所有属性不为空;虽然有些是空的

VS2008不允许我进入InsertOnSubmit,所以我无法知道在进行评估时具体什么是空的。有什么好处


注意:我已经检查过了,由FK关系创建的所有Linq.EntitySet都存在且不为空。

如果在提交更改之前放置断点,您可以尝试查看发生了什么,将进行哪些更改,并快速查看。

这是设计师生成的数据上下文还是您自己手工构建的数据上下文。我怀疑在您尝试使用
InsertOnSubmit()
时IPs表可能没有实例化。我看不出设计器生成的DataContext会发生什么情况,但大家都知道我经常忘记在自己的代码中初始化集合。

明白了

我没有创建从DataContext的类继承的类,而是在业务逻辑层中用一个分部类扩展了DC类本身。从那里我可以添加任何我想要的构造函数和方法

在这种情况下,有必要从现有(自动生成)构造函数复制代码:

public IP(string address) {
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions));
OnCreated(); }
公共IP(字符串地址){
地址=地址;
域名=”;
注“”;
FirstAccess=DateTime.Now;
LastAccess=DateTime.Now;
this.\u Sessions=newentityset(新操作(this.attach\u Sessions)、新操作(this.detach\u Sessions));
onCreate();}

不确定OnCreated处理程序中有什么,但它似乎在做之前让我头疼的工作。现在可以正常工作:)

因为默认构造函数已经初始化base(),this.\u会话并运行OnCreated方法,所以在扩展构造函数中只需执行以下操作:

public IP(string address) : this()
{
    Address = address;
    Domain = "";
    Notes = "";
    FirstAccess = DateTime.Now;
    LastAccess = DateTime.Now;
}

实际上,最好向构造函数添加一个调用,该调用也会调用通用构造函数,例如:

public IP(string address) : this() {
...
}

我的情况与提问者略有不同,但出于同样的原因,我犯了同样的错误。我在一个分部类中为数据库实体编写了新的构造函数,然后尝试在
InsertOnSubmit
调用中使用生成的对象

这些答案没有一个能直接帮助我,但在阅读了所有的答案后,我能够弄明白他们的意思

为实体自动生成的无参数构造函数会执行
InsertOnSubmit
工作所需的操作,因此如果重载构造函数(如我)或从类继承(如asker),则需要从新构造函数调用基构造函数,如下所示:

public partial class Entity {
    public Entity( Type parameter ) : this() {
        // do things with the parameter
    }
}


好啊它永远不会到达那一行,因为异常是在InsertOnSubmit上引发的。这不是解决方案,但是+1提供了一些我不知道的有用的东西。不,我创建了一个DataContext,从数据连接拖放了表,并通过构造函数。。。嗯,建筑。选择所有工作都很好。这不是解决方案,而是+1,因为它引导我朝着提供解决方案的一般方向前进。我认为调用自动生成的构造函数(使用:this())要比复制粘贴它好得多。仍然不清楚为什么我们必须用分部类扩展DataContext类。我试着这样做,
public-class-IP:DC.IP{public-IP():base(){…}
这里有什么不正确的地方?我找到了答案。Linq到Sql不支持从DataContext实体类继承类。这个链接详细说明了@Nasreddine的可能重复:我不认为2009年提出的问题可能是2011年提出的问题的重复。
public class SubEntity: Entity {
    public SubEntity( Type parameter ) : base() {
        // do things with the parameter
    }
}