LINQ InsertOnSubmit: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 Business Logic layer: public class IP : DC.IP { public IP(string address) { ... } } 

在尝试InsertOnSubmit(ip)时,我得到一个NullReferenceException(对象引用未设置为对象的实例)。 dc不为空; ip和ip的所有属性都不为null; 虽然有些是空的。

VS2008不会让我进入InsertOnSubmit,因此在评估时我无法知道具体为null。 是什么赋予了?

注意:我已经检查过,并且由FK关系创建的所有Linq.EntitySets都存在且非空。

实际上最好添加对构造函数的调用,该构造函数也调用generics构造函数,例如:

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

得到它了。

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

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

 public IP(string address) { Address = address; Domain = ""; Notes = ""; FirstAccess = DateTime.Now; LastAccess = DateTime.Now; this._Sessions = new EntitySet(new Action(this.attach_Sessions), new Action(this.detach_Sessions)); OnCreated(); } 

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

由于默认构造函数已初始化base(),this._Sessions并运行OnCreated方法,因此您需要在扩展构造函数中执行以下操作:

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

这是设计器生成的DataContext还是您自己手工构建的DataContext。 我怀疑在您尝试InsertOnSubmit()时可能无法实例化IP表。 我无法看到设计器生成的DataContext会如何发生这种情况,但我已经知道忘记在我自己的代码中不时初始化我的集合。

如果在SubmitChanges之前放置断点,可以尝试查看正在发生的事情,将要进行的更改,并快速观察dc.GetChangeSet() 。

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

这些答案都没有直接帮助我,但我能够在阅读完所有内容后弄清楚他们得到了什么。

实体的自动生成的无参数构造函数执行InsertOnSubmit需要发生的事情,所以如果你重载构造函数 – 比如我 – 或者从类inheritance – 比如提问者 – 你需要调用base来自新构造函数的构造函数,如下所示:

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

要么

 public class SubEntity: Entity { public SubEntity( Type parameter ) : base() { // do things with the parameter } }