Effortで外部キー参照を強制解除する

c# effort

質問

私は、Visual StudioとC#でEffortを使用してデータベースを再作成し、ユニットテストしています。私は単一のテーブルのためのクラスを書いているので、私はそのテーブルのオブジェクトでデータベースにデータを取り込みます。私の問題は、Effortデータベースが、オブジェクトの外部キーがデータベース内の実際のオブジェクトを参照することを望んでいることです。

私のエラーは

System.Data.Entity.Infrastructure.DbUpdateException:エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。

System.Data.Entity.Core.UpdateException:エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。

System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。

NMemory.Exceptions.ForeignKeyViolationException:外部キー違反[Table1 :: SettingsId]。キー値[0]は、参照されるテーブル[Table2 :: SettingsId]に存在しません。エラーコード:RelationError

この特定のテーブルは多くの他の外部キーを持つオブジェクトに多くの外部キーを持っているので、多くの作業が必要になります。これをオフにしてこのテーブルだけをテストできるように努力する方法はありますか?

受け入れられた回答

私もこの問題に遭遇し、大きなデータベースの範囲でテーブルをテストしたかったのです。必要なものすべてをインスタンス化し、その結果としてデータベースまたはテーブルを参照渡しするヘルパーメソッドを作成できます。それはあなたが必要とするテストメソッド/クラスからいつでも呼び出すことができるので役に立ちます。


人気のある回答

テスト専用にデータベースから新しい.edmxファイルを作成することができます。例えば:

Visual Studioで、ファイル - >新規 - >データ - >エンティティデータモデルを選択します。 「データベースからEF Designer」を選択します。既存のSQL Serverデータベースへの接続を選択または作成し、app.configの接続設定を "testConnectionString"として保存します。

データモデルデザイナーで、不要な外部キー関係を削除します。デザイナを保存し、プロジェクトを再構築します。

Effortで、新しい.edmxを作成したときに生成された接続文字列の名前を次のようにCreateTransient渡します。

EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");

MyDbContext context = new MyDbContext(connection);

これにより、関連する外部キー表にデータを入れる必要なく、表に値を挿入できます。

しかし、これには警告があります。テストしているコードが外部キーに依存するナビゲーションプロパティを使用している場合、それは失敗します。これは、このような「単体テスト」がいかに貴重なのか不思議に思います。




ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ