5

データベース アクセスに EF を使用するライブラリを開発しています。ライブラリの外部にエンティティが公開されるのを避けるために、すべてのテーブルのアクセスを内部に設定しました (エンティティ コンテナー アクセスも内部に設定しました)。問題は、ライブラリ内でエンティティを ID で取得しようとすると、Whereクエリが例外をスローすることです。理由はわかりません。

内部アクセスはダイアグラム (.edmx ファイル) に設定されており、ライブラリ内のファクトリとして使用している静的クラスには次のようなものがあります。

var id = 1234;
var mec = new MyEntitiesContainer();
var myEntity = mec.MyEntities.Where(e => e.MyEntitiesId == id).FirstOrDefault();

ID によってデータベースから具体的なエンティティ (行) を取得する単純な where クエリ。

すべてのエンティティ クラス アクセスがパブリックの場合は問題ありませんが、それらを内部に設定すると、次の例外がスローされます。

System.ArgumentNullException: Value cannot be null.  Parameter name: source     
    at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)

助言がありますか?

4

2 に答える 2

5

アップデート!実際に、この問題に対するより直接的な解決策を見つけました:

  1. デザイナーで edmx を開きます
  2. 「エンティティ コンテナー アクセス」を内部に設定します。
  3. すべてのエンティティの「アクセス」がパブリックに設定されていることを確認してください
  4. edmx を展開し、エンティティ t4 を編集します (*.Context.tt ではありません)。
  5. t4で検索して(またはVBの場合)にAccessibility.ForType(entity)置き換えます"Internal""Friend"
  6. T4 を保存して再実行すれば完了です。

これらの手順を実行した後、EF アイテムのどの部分もアセンブリの外部に表示されず、すべてが「正常に機能する」はずです。

「値を null にすることはできません」という例外が引き続き発生する場合は、この投稿の下部にある「落とし穴」を参照してください。




これはすでにここで回答されています: c# DbSet - 内部オブジェクトを取得できません

要点は、entityset/dbset プロパティを internal として設定すると、EF によって自動的にインスタンス化されないということです。ただし、そのページの受け入れられた回答で説明されているように、手動でインスタンス化できます。




注意すべきもう 1 つの落とし穴:

VS2012 (バージョン 11.0.60610.01 Update 3 が私の現在の環境です) にはバグがあり、デザイナーはアイテムを適切に設定せず、基になる edmx ファイルでパブリックに戻すように報告します。

そのため、アイテムをパブリックに戻し、コンテキスト t4 を再実行して再構築した後でも、その例外が発生します。

私が見つけた唯一の回避策は、edmx ファイルを開いて手動で編集し、内部を公開に戻すことです。

于 2013-08-29T01:44:39.083 に答える
0

名前空間のオブジェクトのプロパティを設定するために、別の名前空間のコードはどのように意図されていますか? EF がコードとは異なる名前空間に存在し、その中にプロパティを設定する方法を考えると、それpublicはある程度必要なことだと思います。

于 2012-12-19T10:52:38.523 に答える