26

私のデータベースには、StaffMembersというテーブルがあります

linq-to-sqlを使用してこれを.netプロジェクトに取り込むと、エンティティクラスStaffMemberが作成されます。

これで、プロジェクトに部分クラスStaffMemberも作成して、他の最上位レイヤーで使用するプロパティを追加しました。例えば。IsDeletedプロパティ。この部分クラスは、他のいくつかのプロパティも確実に実装されるように、抽象クラスとインターフェースも継承します。

「StaffMember」の新しいインスタンスを作成すると

例えば。StaffMember newStaff = new StaffMember(); そしてそれにすべてのプロパティなどを与えます

次に、マネージャーを介してコンテキストでInsertOnSubmitを呼び出します。

Add(StaffMember newStaff)
{
     context.StaffMembers.InsertOnSubmit(newStaff);
     context.Save();
}

「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生します。

on context.StaffMembers.InsertOnSubmit(newStaff);

スタックは言う

"   at System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance)\r\n   at 
System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance)\r\n   at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)\r\n   at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.get_HasDeferredLoaders()\r\n   at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level)\r\n   at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)\r\n   at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj)\r\n   at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)\r\n   at 
BusinessObjects.StaffMemberManager.Add(StaffMember staffMember) in     
C:\\StaffMemberManager.cs:line 251"

なぜこれが起こっているのか、そしてそれを回避する方法は何かという考え。

ありがとう

4

2 に答える 2

44

了解しました。http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9fで回答を見つけました。

まだ答えを探している人がいる場合に備えて。

この問題は、部分クラスのコンストラクターをオーバーロードし、その中でデフォルトのコンストラクターを呼び出さない場合に発生します。

エンティティのデフォルトコンストラクタは、Contextオブジェクトに必要ないくつかのことを実行します。

したがって、部分クラスにオーバーロードコンストラクタがあり、それを使用してオブジェクトを作成する場合は、デフォルトのコンストラクタが最初の行で呼び出されていることを確認してください

C#では、次の方法でこれを行うことができます

例えば。

 Customer(string custID)

追加する必要があります

 Customer(string custID):this()

C#では、Customerは私のクラスであり、Customer(string custID):this()は私の部分クラスのオーバーロードコンストラクターです。

于 2010-02-04T08:15:20.577 に答える
1

時々、この行を基本クラスに追加するのを忘れただけです。

[InheritanceMapping(Code = "Class"、Type = typeof(Class))]

于 2010-03-17T00:43:27.590 に答える