16

我有这个代码:

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,所以我无法知道在评估时具体是什么 null。是什么赋予了?

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

4

6 回答 6

10

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

public IP(string address) : this() {
...
}
于 2009-10-14T23:53:53.137 回答
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 处理程序中有什么,但它似乎正在做让我更早的工作。现在工作正常:)

于 2009-01-31T21:28:19.107 回答
5

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

public IP(string address) : this()
{
    Address = address;
    Domain = "";
    Notes = "";
    FirstAccess = DateTime.Now;
    LastAccess = DateTime.Now;
}
于 2009-02-10T16:32:20.470 回答
2

如果您在 SubmitChanges 之前放置断点,您可以尝试查看发生了什么,将进行哪些更改,并快速查看dc.GetChangeSet()

于 2009-01-31T20:05:54.623 回答
2

这是设计师生成的 DataContext 还是您自己手工构建的。我怀疑在您尝试使用InsertOnSubmit(). 我看不出设计器生成的 DataContext 会如何发生这种情况,但众所周知,我经常忘记在自己的代码中初始化我的集合。

于 2009-01-31T20:38:02.983 回答
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
    }
}
于 2014-09-23T05:31:38.467 回答