1

データベースのアップロード スクリプトに問題があります。基本的には、バックアップ ソースからすべてのエンティティをデータベースに追加するだけです。

ただし、新しいデータベースの一部のフィールドは古いデータ ソースには存在しないため、デフォルト値を割り当てます。例については、以下のスクリーンショットを参照してください。文字列プロパティCCP1_description(およびその下の同様の名前の説明) は、"Enter description here."

ただし、エンティティを保存すると、説明フィールドを NULL にすることはできないという例外が発生します。明らかにそうではありません。

コード + 例外のスクリーンショットを参照してください

問題のスクリーンショット

これは私のデータベース作成スクリプトのスニペットです。列がどのように設定されているかを示しています。

...
[CCP1_description] nvarchar(max)  NOT NULL,
[CCP2_description] nvarchar(max)  NOT NULL,
[EP1_description] nvarchar(max)  NOT NULL,
[EP2_description] nvarchar(max)  NOT NULL,
[EP3_description] nvarchar(max)  NOT NULL,
[EP4_description] nvarchar(max)  NOT NULL,
[EP5_description] nvarchar(max)  NOT NULL,
...

デバッグ時に変数を確認するtempと、説明フィールドの内容がはっきりとわかります (すべてが""Enter description here.本来あるべき姿です。

スクリーンショット2

多くのことがこの例外を引き起こす可能性があることを知っています。しかし、この問題の根本的な原因はわかりません。誰かがこれに光を当てることができますか? この例外がスローされる理由がわかりません...

同じエラーで多くの未解決の質問が見つかりましたが、私のフィールドはデータベースで生成されておらず、PK または IDENTITY フィールドでもないため、これは別の状況だと思います。エンティティが構築されているときは空ではなく、追加されているオブジェクトには実際に正しい値があります。

アップデート

最初の 83 個のエンティティが正しく追加されていることに気付きました。コードが実行される 84 回目に例外がスローされます (その後も何度も発生します。つまり、問題はおそらく別のプロパティ フィールド内にあります。

すべてのフィールドをチェックしnullましたが、データベースとエンティティ フレームワークで null 可能に設定されているフィールドに値のみが追加されています。

そして、説明フィールドで例外がスローされる理由が本当にわかりません。

更新 2

このアプリケーションは、サルバドール・ダリによってコーディングされたようです。

コードを手直ししましたが、今回はその行をコメントアウトしました.AddObject(temp);。つまり、エンティティは作成されますが、db コンテキストには追加されません。呼び出しはdb.SaveChanges();実際には冗長であり、何もしません。

またはそう私はしかし。結局のところ、私のエンティティはまだ追加されています。私はコード実行全体をステップ実行しましたが、 を除いて db コンテキストを使用することはありdb.SaveChanges();ませんが、それでもすべてが追加されます。逆に、カウンターが 100 に達した後にのみエンティティの追加を開始した場合 (つまり、アイテム 100、101、102、... のみが保存され、残りはすべて追加されません)、他のエンティティを次のように追加し続けます。良い。

私にはまったく手がかりがありません。文字通りなし。詳細がわかり次第、投稿を更新します。

最終更新

回避策を見つけることができました(以下の私の回答を参照してください)。しかし、なぜこれが起こっているのか、私はまだ説明を探しています。誰かが私にこれを説明できるなら、私は彼らにこの質問への答えを与えます.

4

1 に答える 1

0

コードをもう少し進めることができました。作業順序を変更しました。それは従来:

//1. initialize temp
//2. fill in temp; field by field.
//3. if any missing (required) fields are encountered during step 2, then continue the foreach loop and take the next element (no save)
//4. else, add to database ad save changes

どういうわけか、これを説明することはできませんが、エンティティは自動的に保存されます。上記とまったく同じコードを実行しても、.AddObject()関数は追加されません。

だから私は自分のコードを次のように変更しました:

//1. Find all fields that will be needed for the entity
//2. If any required field is stille empty, continue the foreach loop
//3. initialize temp (inline initialization with all properties)
//4. Add object and save.

これは元の問題を実際に解決するものではなく、単なる回避策です。これらのエンティティが追加されている理由を説明できる人がいれば、それを問題の解決策として受け入れます。

于 2012-10-02T07:57:38.087 に答える