エンティティフレームワークコア3.1.1で複雑なSQLクエリを実行する必要があります。調査したところ、キーレスエンティティタイプがコードを最初に使用する方法であることがわかりました。 dbqueryに関するドキュメントがたくさんありますが、これは.net core 3.xで廃止されているとマークされています
Microsoftのドキュメントによると、dbqueryは廃止されたため、代わりにdbsetアプローチを使用していますが、dbsetではデータベースに新しいテーブルを作成しようとしています。移行の適用中にキーレスエンティティタイプのテーブル生成を無効にする方法
サンプルコード
public class ApplicationContext : DbContext
{
public DbSet<CustomQuery> CustomQuery { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Ignore<CustomQuery>();
modelBuilder.Entity<CustomQuery>().HasNoKey();
}
}
.net core 2.2
var entity = _context.Query<CustomQuery>().FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
.net core 3.1
var newEntity = _context.CustomQuery.FromSqlRaw(Regex.Unescape(selectQuery)).AsNoTracking().FirstOrDefault();
移行を適用しようとすると、カスタムクエリの名前で新しいテーブルが作成されますが、これを実行する必要はありません。これは、結合クエリからの値を保持するために使用される単なるモデルであり、このテーブルの値を挿入、更新、または削除しないためです。これを達成する方法?
または、この状況に適したアプローチがあります。
これはEF Core 3の既知の欠陥であり、ここで報告されます 3.0アップグレード-HasNoKey()(以前のクエリタイプ)を持つエンティティは、移行を追加するときにテーブルを作成しようとします#18116 。
To vs Fromメソッドの「複製」としてクローズ:ToTable、ToQuery、ToView、FromSql、およびその他の関連メソッドを合理化する提案#17270 および モデルの一部を移行から除外/スキップ/無視して、テーブルが作成されないようにする機能(重複する境界コンテキストの場合)#2725 、どちらも5.0リリースの予定つまり、そのリリースで最終的に対処されることになります。
現在の回避策は、EF Coreチームメンバーの1人による コメント で言及されています。
とりあえず、
.ToView("You forgot to use FromSql with ModQueueEntry")
のようなものを使用できます
より一般的には、.ToView(null)
を使用します。
modelBuilder.Entity<CustomQuery>().HasNoKey().ToView(null);