SQLite のその他の注意事項

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 が効果的に呼び出されます。