質問: context.MyProcsDbSet.ExecuteSQL("Myproc @p0", 1); } ``` これは問題なく機能することに注意してください。しかし、新しいマイグレーションを作成しようとすると、テーブルが生成されます。大丈夫、私はそのテーブルを構築しないようにOn Model Creationで述べます。 ``` bldr.Ignore(); ``` いいえ、今は機能していたプロシージャを呼び出すと、次のようになります。 > このタイプはコンテキストのモデルに含まれていないため、「MyProcsDbSet」のDbSetを作成できません。 > > **プロシージャの戻り値のdbsetを取得し、テーブルを作成するためのefコアの要求を永久に抑制する必要がない方法はありますか?** .NET Core EFコードの機能は、常に最大の欠点であるように思われますが、カスタムオブジェクトとそれらの作成および取得が最大の欠点でした。
回答: `Ignore` (または`[NotMapped]`属性)は、テーブルの生成を抑制するためのものではありません。基本的には、EF Coreにクラスとそのプロパティをモデルの一部として考慮しないように指示しているため、LINQ to Entitiesクエリやその他のEF Coreが提供するサービスでは使用できません。 EF Core 2.xで目標を達成するための唯一のオプションは、SP結果クラスをクエリタイプとしてマップすることです。 > エンティティタイプに加えて、EF Coreモデルにはクエリタイプを含めることができます。これを使用して、エンティティタイプにマップされていないデータに対してデータベースクエリを実行できます。 > > クエリタイプにはいくつかの制限がありますが、同時にデフォルトではデータベースオブジェクトにマップされないため、 `FromSql`での使用に`FromSql`です。 必要なのは、定義を`DbSet`から`DbSet`に変更すること`DbQuery`です。 ``` public virtual DbQuery MyProcsDbSet{ get; set; } ``` 流暢な設定がある場合は、 `modelBuilder.Query`ではなく、 `modelBuilder.Entity`を使用して`modelBuilder.Query` 。 EF Core 3.0では、 クエリタイプがエンティティタイプに統合されるため、上記は変更されます 。したがって、基本的には、 `DbSet` (および`modelBuilder.Entity` )を`HasNoKey` APIと組み合わせて使用する必要があります。正確な動作がどうなるかを言うのは時期尚早ですが、デフォルトでは*キーレス*エンティティタイプ(3.0で呼び出される)がテーブルにマッピングされないか、エンティティにそのことを伝える特別なFluent APIがあると思います関連付けられたテーブルはありません。これは2.xで便利`HasNoTable()` -冒頭で述べたように、 `Ignore`は別の意味を持っているので、 `HasNoTable()` 、 `[Table(null)]` 、または`.ToTable(null)`ようにして、テーブル生成を明示的に抑制しますよかったでしょう。 しかし、それが何であるかということなので、クエリタイプを使用するか、生成された移行から「テーブル」と関連コマンドを手動で削除します。