LINQ InsertOnSubmit:NullReferenceException

时间:2009-01-31 19:57:07

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

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

VS2008不会让我进入InsertOnSubmit,所以在评估时我无法知道具体是什么。是什么给了什么?

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

6 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:5)

知道了。

我没有创建一个继承自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(); }

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

实体的自动生成的无参数构造函数执行需要InsertOnSubmit才能工作的事情,所以如果你重载构造函数 - 比如我 - 或者从类继承 - 比如提问者 - - 你需要从你的新构造函数中调用基础构造函数,如下所示:

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