SaveChanges と RETURNING 句
EF Core は、データベースへの変更を保存するときに、SQL RETURNING 句を使用して最適化された手法を使用して保存します。 残念ながら、RETURNING 句にはいくつかの制限があります。たとえば、仮想テーブルや特定のトリガーの種類のテーブルでは使用できません。
RETURNING 句の使用に関連する制限が発生した場合は、次の UseSqlReturningClauseを使用して、特定のテーブルで無効にすることができます。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.ToTable(tb => tb.UseSqlReturningClause(false));
}
これを行うと、EF はテーブルを更新するための古い効率の低い手法に切り替わります。
ほとんどのテーブルまたはすべてのテーブルにトリガーがある場合は、次の モデル構築規則を使用して、すべてのモデルのテーブルに対してこれを構成できます。
public class NoOutputClauseConvention : IModelFinalizingConvention
{
public virtual void ProcessModelFinalizing(
IConventionModelBuilder modelBuilder,
IConventionContext<IConventionModelBuilder> context)
{
foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
{
var table = StoreObjectIdentifier.Create(entityType, StoreObjectType.Table);
if (table is not null)
{
entityType.Builder.UseSqlReturningClause(false);
}
foreach (var fragment in entityType.GetMappingFragments(StoreObjectType.Table))
{
entityType.Builder.UseSqlReturningClause(false, fragment.StoreObject);
}
}
}
}
これにより、すべてのテーブルに対して手動で行う必要なく、すべてのモデルのテーブルに対して UseSqlReturningClause が効果的に呼び出されます。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET