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 は null ではありません。ip および ip のすべてのプロパティは null ではありません。一部は空ですが。

VS2008 では InsertOnSubmit にステップ インさせてくれないので、評価時に具体的に何が null かを知る方法がありません。何を与える?

注: チェックしたところ、FK リレーションシップによって作成されたすべての Linq.EntitySets が存在し、null ではありません。

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 ですか、それとも独自に作成したものですか。を試した時点で IP テーブルがインスタンス化されていないのではないかと思います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 に答える